<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>php &#8211; Kodono</title>
	<atom:link href="https://blog.kodono.info/wordpress/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.kodono.info/wordpress</link>
	<description>Pour tous les technophiles</description>
	<lastBuildDate>Sat, 20 Aug 2016 10:13:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>
	<item>
		<title>Get color_id from a Google Calendar using API [PHP]</title>
		<link>https://blog.kodono.info/wordpress/2016/04/18/get-color_id-from-a-google-calendar-using-api-php/</link>
					<comments>https://blog.kodono.info/wordpress/2016/04/18/get-color_id-from-a-google-calendar-using-api-php/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Mon, 18 Apr 2016 07:50:13 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Niveau intermédiaire]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://blog.kodono.info/wordpress/?p=1637</guid>

					<description><![CDATA[For a project I needed to get the events from a Google Calendar, as well as the colors from it. It&#8217;s been a pain, but after a couple of days I&#8217;ve been able to create a PHP page to do so. It will use the server-to-server auth mechanism. I&#8217;ll try to provide the different steps [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>For a project I needed to get the events from a Google Calendar, as well as the colors from it.</p>
<p>It&#8217;s been a pain, but after a couple of days I&#8217;ve been able to create a PHP page to do so. It will use the <a href="http://www.riskcompletefailure.com/2015/03/understanding-service-accounts.html">server-to-server auth mechanism</a>.</p>
<p>I&#8217;ll try to provide the different steps (please note that my Google Console is in French so I tried to translate) :</p>
<ol>
<li>Go to <a href="https://console.developers.google.com/apis/api/calendar/overview">https://console.developers.google.com/apis/api/calendar/overview</a> and <strong>Activate the Calendar API</strong> (or create first a project if required)</li>
<li>Once the API is activated you should be invited to go to the Identification part ; make sure you choose <strong>&#8220;Account Service Key&#8221;</strong> for the identification mode</li>
<li>Then pick <strong>&#8220;New Service&#8221;</strong> and complete the fields (choose JSON for the file format)</li>
<li>Download the JSON file and save it where your PHP file will stand on your web server</li>
<li>Open the JSON file and search for the <strong>client_email</strong></li>
<li>Go to <a href="https://calendar.google.com/">https://calendar.google.com/</a> and in the sharing parameters : make sure that you share your calendar in editing with the <strong>client_email</strong> address found in the previous step (the editing mode is required to get the Colors)</li>
<li>Now you need to install the <a href="https://developers.google.com/api-client-library/php/start/installation">PHP library from Google</a> &#8230; in my case I don&#8217;t have a console access on the server, so I transfered the files from Github to the web server, in the same directory as our PHP file will be (so I got a folder called <em>google-api-php-client-1.1.7</em>)</li>
<li>Create your PHP file with the below content :
<pre class="brush:php">
&lt;?php
// make sure the include path got the Google API (please refer to https://developers.google.com/api-client-library/php/start/installation)
set_include_path(get_include_path() . PATH_SEPARATOR . '/full/path/WordPress/wp-content/agenda/google-api-php-client-1.1.7/src/Google');
require_once "autoload.php";

// Connect to the Google Calendar Service
$client = new Google_Client();
$client->setApplicationName("Google Calendar");
$data = json_decode(file_get_contents('YourKeyFile-xxxxx.json'));
$client_id = $data->client_id;
$client_email = $data->client_email;
$cred = new Google_Auth_AssertionCredentials(
  $client_email,
  array(Google_Service_Calendar::CALENDAR),
  $data->private_key
);

// Remember to cache the access token locally if making multiple calls
// and don't just use this function for each request!
$client->getAuth()->refreshTokenWithAssertion($cred);
$service = new Google_Service_Calendar($client);
$optParams = array(
  "calendarId"   => "TheGoogleAccountForTheCalendar@gmail.com",
  "singleEvents" => true,
  "timeZone"     => "Europe/Paris",
  "maxResults"   => 250,
  "timeMin"      => date("c", strtotime("midnight")), /* to get events from today... */
  "timeMax"      => date("c",strtotime('+3 day')), /* ...to the 3 next days */
  "orderBy"      => "startTime"
);
$events = $service->events->listEvents('TheGoogleAccountForTheCalendar@gmail.com', $optParams);
?>
&lt;!DOCTYPE html>
&lt;html>
  &lt;head>
    &lt;meta charset="UTF-8">
    &lt;meta http-equiv="Content-Language" content="fr" />
    &lt;meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
  &lt;/head>
  &lt;body>
&lt;?php
  while(true) {
    foreach ($events->getItems() as $event) {
      $endTime = new DateTime($event->getEnd()->getDateTime());
      echo $event->getSummary() ." [".$event->getColorId()."] (".$endTime->format('Y-m-d').")&lt;br>";
    }
    $pageToken = $events->getNextPageToken();
    if ($pageToken) {
      $optParams['pageToken'] = $pageToken;
      $events = $service->events->listEvents('lgpmontpellier@gmail.com', $optParams);
    } else {
      break;
    }
  }
?>
  &lt;/body>
&lt;/html>
</pre>
<p>Finally you can refer to the <a href="https://developers.google.com/google-apps/calendar/?csw=1">Google Calendar API</a>.</p>
<p>FYI I retrieved the below colorId for the below available colors:<br />
<img decoding="async" src="https://blog.kodono.info/wordpress/wp-content/uploads/2016/04/colors_google_calendar.png" alt="" width="288" height="41" class="aligncenter size-full wp-image-1685" /></p>
<pre class="brush:php">
    // same order as the image above
    switch ($event->getColorId()) {
      case 9: $color="#5484ED"; break;
      case 1: $color="#A4BDFC"; break;
      case 7: $color="#46D6DB"; break;
      case 2: $color="#7AE7BF"; break;
      case 10: $color="#51B749"; break;
      case 5: $color="#FBD75B"; break;
      case 6: $color="#FFB878"; break;
      case 4: $color="#FF887C"; break;
      case 11: $color="#DC2127"; break;
      case 3: $color="#DBADFF"; break;
      case 8: $color="#E1E1E1"; break;
      default: $color="#AC725E"; // the first one in the picture, the one that is checked
    }
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2016/04/18/get-color_id-from-a-google-calendar-using-api-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>&#8220;class-phpmailer out of memory using GuiForm&#8221; avec WordPress</title>
		<link>https://blog.kodono.info/wordpress/2015/10/16/class-phpmailer-out-of-memory-using-guiform-avec-wordpress/</link>
					<comments>https://blog.kodono.info/wordpress/2015/10/16/class-phpmailer-out-of-memory-using-guiform-avec-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Fri, 16 Oct 2015 09:13:43 +0000</pubDate>
				<category><![CDATA[Debug]]></category>
		<category><![CDATA[Divers]]></category>
		<category><![CDATA[Niveau intermédiaire]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">http://blog.kodono.info/wordpress/?p=1542</guid>

					<description><![CDATA[Ayant un WordPress sur 1and1 j&#8217;ai été confronté à un &#8220;out of memory&#8221; sur le fichier class-phpmailer.php à cause d&#8217;un appel AJAX d&#8217;un formulaire créé avec GuiForm. Je ne peux pas faire grand chose côté serveur à cause de l&#8217;hébergement partagé&#8230; Donc j&#8217;ai fouillé comment contourner le problème. Il va s&#8217;agir de modifier le fichier [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Ayant un WordPress sur 1and1 j&#8217;ai été confronté à un &#8220;out of memory&#8221; sur le fichier <code>class-phpmailer.php</code> à cause d&#8217;un appel AJAX d&#8217;un formulaire créé avec GuiForm. Je ne peux pas faire grand chose côté serveur à cause de l&#8217;hébergement partagé&#8230; Donc j&#8217;ai fouillé comment contourner le problème.</p>
<p>Il va s&#8217;agir de modifier le fichier <code>guiform/classes/GuiForm/Module/Ajax.php</code> du plugin.</p>
<p>On va remplacer la fonction <code>mailer()</code> afin d&#8217;utiliser la fonction <code>wp_mail</code> fournie par WordPress. La fonction <code>mailer()</code> devient :</p>
<pre class="brush:php">
	public function mailer($type = 'mail', $init = array()){
		
		global $wpdb, $guiform;
		
		$subject = "";
		$MsgHTML = "";
    $headers = "";
    $attachments = "";
		$sendTo = array_map('trim', explode(',', $init['to']));
				
		$sendCc = array_map('trim', explode(',', $init['cc']));
		$sendBcc = array_map('trim', explode(',', $init['bcc']));
		$sendReplyTo = array_map('trim', explode(',', $init['reply-to']));
		
		/* Make sure the PHPMailer class has been instantiated 
		// (Re)create it, if it's gone missing
		if ( !is_object( $phpmailer ) || !is_a( $phpmailer, 'PHPMailer' ) ) {
			require_once ABSPATH . WPINC . '/class-phpmailer.php';
			require_once ABSPATH . WPINC . '/class-smtp.php';
			$phpmailer = new PHPMailer(true);
			$phpmailer->clearAllRecipients();
		  $phpmailer->SMTPAuth = true;
		}*/
		
		if($type == 'test-mail'){
			$data = $wpdb->get_row($wpdb->prepare("SELECT name, value FROM $wpdb->guiform_options WHERE id = %d", $this->_id));
		  $sendTo = array($data->name);
		  $row = unserialize($data->value);
		  $row = array_map('trim', $row);
			$html = "&lt;strong>". __('Greetings!', GuiForm_Plugin::NAME) ."&lt;/strong>&lt;br />&lt;br />";
			$html .=  __("This is a test message.", GuiForm_Plugin::NAME) ."&lt;br />&lt;br />";
			$MsgHTML = self::emailTpl($html);
			/*$phpmailer->SetFrom("noreply@guiform.com", GuiForm_Plugin::PACKAGE);
			$phpmailer->Subject = __('Test Message', GuiForm_Plugin::NAME);*/
      $headers .= 'From: noreply@guiform.com' . "\r\n";
      $subject = __('Test Message', GuiForm_Plugin::NAME);
		}
		else if($type == 'activation-mail'){
			$data = $wpdb->get_row($wpdb->prepare("SELECT name, value FROM $wpdb->guiform_options WHERE id = %d", $this->_id));
		  $row = unserialize($data->value);
		  $row = array_map('trim', $row);
		  $mv_code = md5(time());
			$row['key'] = $mv_code;
			$guiform->updateOption($data->name, $row, 'mail', $this->_id);
			//$phpmailer->Subject = __("Email Verification", GuiForm_Plugin::NAME);
      $subject = __("Email Verification", GuiForm_Plugin::NAME);
			$sendTo = array($data->name);
			$vlink = get_site_url() ."/?". $guiform->getOption('permalink')->value['value'] .'='. $this->_id ."&#038;mv-code=$mv_code";
		
			$html = "Hello ".$row['name'].",&lt;br />&lt;br />";
			$html .= __("To enable this email address from sending emails with your forms we must first verify by clicking the link below:", GuiForm_Plugin::NAME) ."&lt;br />&lt;br />";
			$html .= __("Verification Link: ", GuiForm_Plugin::NAME) ."&lt;a target=\"_blank\" href=\"$vlink\">". __("click here!", GuiForm_Plugin::NAME) ."&lt;/a>&lt;br />&lt;br />";
			$MsgHTML = self::emailTpl($html);
			//$phpmailer->SetFrom("noreply@guiform.com", "GuiForm");
      $headers .= 'From: noreply@guiform.com' . "\r\n";
		}
		else if($type == 'mail'){	
			
			$init['message'] = str_replace("\\r\\n", "&lt;br />", $init['message']);
			$init['message'] = stripcslashes($init['message']);
			
			//Do not remove &#038;nbsp and &lt;br />.
			$MsgHTML = $init['message'] ." &nbsp; &lt;br />";
			
			//$phpmailer->SetFrom($init['from'], "");
			//$phpmailer->Subject = $init['subject'];
      $headers .= 'Reply-To: '.$init['from'] . "\r\n";
      $headers .= 'From: '.$init['from'] . "\r\n";
      $subject = $init['subject'];
			
			if(sizeof($init['attachment'])){
				foreach($init['attachment'] as $file){
					//$phpmailer->AddAttachment(self::getAttachmentPath($file['url']), $file['name']);
          $attachments = self::getAttachmentPath($file['url']);
				}
			}
			
			if(sizeof($sendReplyTo)){
				foreach($sendReplyTo as $replyTo){
					if(is_email($replyTo)){
						//$phpmailer->AddReplyTo($replyTo);
            $headers .= 'Reply-To: '.$replyTo. "\r\n";
					}
				}
			}
			
			
			if(sizeof($sendCc)){
				foreach($sendCc as $mailCc){
					if(is_email($mailCc)){
				  	//$phpmailer->AddCC($mailCc);
            $headers .= 'Cc: '.$mailCc."\r\n";
					}
				}
			}
			
			if(sizeof($sendBcc)){
				foreach($sendBcc as $mailBcc){
					if(is_email($mailBcc)){
				  	//$phpmailer->AddCC($mailBcc);
            $headers .= 'Bcc: '.$mailBcc."\r\n";
					}
				}
			}
		}
		
		/*$phpmailer->Body = html_entity_decode($MsgHTML);
		$phpmailer->AltBody = strip_tags($MsgHTML);
		$phpmailer->IsHTML(true);
		$phpmailer->CharSet = "UTF-8";*/
    $headers .= 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-Type: text/html; charset=UTF-8'."\r\n";
    $body = html_entity_decode($MsgHTML);
		wp_mail( $sendTo, $subject, $body, $headers, $attachments);
/*
		foreach($sendTo as $mailTo){
			if($phpmailer->validateAddress($mailTo)){
				$phpmailer->AddAddress($mailTo);
			}
		}
		
		$smtpSettings = $guiform->getOption($this->form, false, 'smtp')->value;
		
		if($smtpSettings->smtp_enable){
			$row['protocol'] = 'smtp';
			$row['smtp_host'] = $smtpSettings->smtp_host;
			$row['smtp_port'] = $smtpSettings->smtp_port;
		}
		
		$phpmailer->Mailer = $row['protocol'];
		
		if($row['protocol'] == 'smtp'){
			$phpmailer->IsSMTP();
			$phpmailer->SMTPSecure = $row['smtp_encryption'];
			$phpmailer->Host       = $row['smtp_host'];
			$phpmailer->Port       = $row['smtp_port'];
		}
		
		if(filter_var($row['smtp_auth'], FILTER_VALIDATE_BOOLEAN)) {
			$phpmailer->SMTPAuth = true;
			$phpmailer->Username = trim($row['smtp_username']);
			$phpmailer->Password = trim($row['smtp_password']);
		}
		
    if(!$phpmailer->send()) {
			die( __("Mailer Error: ", GuiForm_Plugin::NAME) . $phpmailer->ErrorInfo);
		} else {
			$phpmailer->clearAllRecipients();
		  $phpmailer->clearAttachments();
			if($type !== 'mail'){
				die( __("Message sent! Please check your email for message.", GuiForm_Plugin::NAME));
			}
		}
*/
	}
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2015/10/16/class-phpmailer-out-of-memory-using-guiform-avec-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ajouter &#8220;nocaptcha reCaptcha&#8221; de Google à Guiform sous WordPress [Astuce]</title>
		<link>https://blog.kodono.info/wordpress/2015/03/09/ajouter-nocaptcha-recaptcha-de-google-a-guiform-sous-wordpress-astuce/</link>
					<comments>https://blog.kodono.info/wordpress/2015/03/09/ajouter-nocaptcha-recaptcha-de-google-a-guiform-sous-wordpress-astuce/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Mon, 09 Mar 2015 16:57:15 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Niveau expert]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">http://blog.kodono.info/wordpress/?p=1463</guid>

					<description><![CDATA[J&#8217;utilise GuiForm pour faire des formulaires dans un WordPress, et je voulais y ajouter le captcha de Google sans pour autant devoir payer la licence chère de GuiForm juste pour ça&#8230; Pour réussir ce que je décris ci-dessous, il vous faudra connaitre votre clé privée et publique de Google Captcha. Il faut commencer par faire [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>J&#8217;utilise <a href="https://wordpress.org/plugins/guiform/">GuiForm</a> pour faire des formulaires dans un WordPress, et je voulais y ajouter le captcha de Google sans pour autant devoir payer la licence chère de GuiForm juste pour ça&#8230;</p>
<p>Pour réussir ce que je décris ci-dessous, il vous faudra connaitre <a href="https://www.google.com/recaptcha/admin">votre clé privée et publique de Google Captcha</a>.</p>
<p>Il faut commencer par faire son formulaire (de contact dans mon cas) avec tous les champs voulus via GuiForm, puis on ajoute un champ de type &#8220;Heading&#8221; avec comme contenu <strong>&#8220;captcha&#8221;</strong>. On sauvegarde le formulaire.</p>
<p>Maintenant dans le fichier <code>functions.php</code> de votre thème il faut rajouter :</p>
<pre class="brush:php">
// on veut rajouter un captcha dans le formulaire de contact
// pour ça on surcharge 'guiform_render_form' qui est appelé par le plugin
function addCaptchaToGuiForm($content) {
  // on va remplacer "&lt;h1>captcha&lt;/h1>" par ce qu'il faut
  $content = str_replace("&lt;h1>captcha&lt;/h1>", "&lt;div class='g-recaptcha' style='float:right' data-sitekey='VOTRE_CLE_PUBLIQUE' data-theme='light'>&lt;/div>&lt;script src='https://www.google.com/recaptcha/api.js'>&lt;/script>",$content);
  // on rajoute aussi du JavaScript
  $content .= '&lt;script>'."\r\n".
              "function waitForjQuery() {"."\r\n".
              "  if (typeof jQuery === 'undefined') { setTimeout(waitForjQuery, 50); return }"."\r\n".
              "  var submit = jQuery('.f_submit');"."\r\n".
              "  var html = '&lt;div class=\"'+submit[0].className+'\">'+submit.html()+'&lt;/div>';"."\r\n".
              "  submit.before(html).find('button').hide().prop('disabled', true);"."\r\n".
              "  var cloneSubmit = jQuery('.f_submit:first');"."\r\n".
              "  cloneSubmit.on('click', function(event) {"."\r\n".
              "    event.preventDefault();"."\r\n".
              "    jQuery.ajax({"."\r\n".
              "      type: 'GET',"."\r\n".
              "      url: '/wp-content/themes/VOTRE_THEME/checkCaptcha?response='+grecaptcha.getResponse(),"."\r\n".
              "      success: function(data) {"."\r\n".
              "        if (data['success'] === true) {"."\r\n".
              "          jQuery('.f_submit:first').remove()"."\r\n".
              "          jQuery('.f_submit').find('button').prop('disabled',false).show().last().trigger('click');"."\r\n".
              "        }"."\r\n".
              "        else if (data['error-codes']) {"."\r\n".
              "          switch (data['error-codes'][0]) {"."\r\n".
              "            case 'missing-input-secret': "."\r\n".
              "            case 'invalid-input-secret': alert('Erreur : impossible de vérifier le système anti-spam.'); break;"."\r\n".
              "            case 'missing-input-response': "."\r\n".
              "            case 'invalid-input-response': "."\r\n".
              "            default: alert('Erreur : vous devez répondre à l\'anti-spam.');"."\r\n".
              "          }"."\r\n".
              "        }"."\r\n".
              "      },"."\r\n".
              "      dataType: 'json'"."\r\n".
              "    });"."\r\n".
              "  })"."\r\n".
              "}"."\r\n".
              "waitForjQuery();"."\r\n".
              "&lt;/script>";
  return $content;
}
add_action('guiform_render_form', 'addCaptchaToGuiForm');
</pre>
<p>Grâce à cette astuce on modifie notre <code>&lt;h1>captcha&lt;/h1></code> par le code de Google. On ajoute un soupçon de JavaScript qui va permettre de cacher le vrai bouton &#8220;Submit&#8221;. Lorsqu&#8217;on va cliquer sur le faux bouton, le catpcha va être vérifié. Une fois fait le formulaire classique peut-être utilisé.</p>
<p><strong>Attention</strong> : dans le code ci-dessus il faut remplacer <em>VOTRE_CLE_PUBLIQUE</em> et <em>VOTRE_THEME</em> par les valeurs correspondantes.</p>
<p>Enfin on a besoin de créer un fichier PHP à la racine de notre thème, qui va s&#8217;appeler <code>checkCaptcha.php</code> et qui aura comme contenu :</p>
<pre class="brush:php">
&lt;?php
$url = "https://www.google.com/recaptcha/api/siteverify?secret=VOTRE_CLE_PRIVEE&#038;response=".$_GET["response"];
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$output = curl_exec($curl);
curl_close($curl);
echo $output;
?>
</pre>
<p><strong>Attention</strong> : dans le code ci-dessus il faut remplacer <em>VOTRE_CLE_PRIVEE</em> par la valeur correspondante.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2015/03/09/ajouter-nocaptcha-recaptcha-de-google-a-guiform-sous-wordpress-astuce/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Encode accented characters of an URL to the hexadecimal version [PHP]</title>
		<link>https://blog.kodono.info/wordpress/2013/07/29/encode-accented-characters-of-an-url-to-the-hexadecimal-version-php/</link>
					<comments>https://blog.kodono.info/wordpress/2013/07/29/encode-accented-characters-of-an-url-to-the-hexadecimal-version-php/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Mon, 29 Jul 2013 08:02:41 +0000</pubDate>
				<category><![CDATA[Niveau débutant]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://blog.kodono.info/wordpress/?p=1234</guid>

					<description><![CDATA[I&#8217;m facing an issue with some accented characters (like &#8216;é&#8217;, &#8216;è&#8217;, &#8216;à&#8217;, &#8230;) in an URL and I wanted to convert them to an hex value in PHP. I found nothing on Google so I have finally created my own function for my needs : function encodeURIHex($str) { $len=strlen($str); $ret=""; for ($i=0; $i 191 &#038;&#038; [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I&#8217;m facing an issue with some accented characters (like &#8216;é&#8217;, &#8216;è&#8217;, &#8216;à&#8217;, &#8230;) in an URL and I wanted to convert them to an hex value in PHP. I found nothing on Google so I have finally created my own function for my needs :</p>
<pre class="brush:php">
function encodeURIHex($str) {
  $len=strlen($str);
  $ret="";
  for ($i=0; $i<$len; $i++) {
    $dec = ord($str[$i]);
    if ($dec > 191 &#038;& $dec &lt; 256) $ret .= "%".strtoupper(dechex($dec));
    else $ret .= $str[$i];
  }
  return $ret;
}
</pre>
<p>Example :</p>
<pre class="brush:php">
encodeURIHex("Mère"); // -> M%E8re
</pre>
<p>I used <a href="http://courshtml.free.fr/donnees/charset.htm">this array</a> to find which values of dec version of my char I wanted to use (from 192 to 255 in my case).</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2013/07/29/encode-accented-characters-of-an-url-to-the-hexadecimal-version-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vérifier du code HTML en PHP</title>
		<link>https://blog.kodono.info/wordpress/2013/06/13/verifier-du-code-html-en-php/</link>
					<comments>https://blog.kodono.info/wordpress/2013/06/13/verifier-du-code-html-en-php/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Thu, 13 Jun 2013 16:01:12 +0000</pubDate>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[Niveau intermédiaire]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://blog.kodono.info/wordpress/?p=1226</guid>

					<description><![CDATA[Supposons que vos utilisateurs peuvent entrer du code HTML et que vous souhaitiez vous assurer que les tags sont correctement fermés. Alors vous pouvez utiliser PHP pour faire ça : $codeUtilisateur = '&#60;p>&#60;b>Mon texte&#60;/b>'; // il manque '&#60;/p>' $doc = new DOMDocument(); // on utilise DOMDocument qui est installé par défaut avec PHP $doc->loadHTML($codeUtilisateur); $codeRetour [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Supposons que vos utilisateurs peuvent entrer du code HTML et que vous souhaitiez vous assurer que les tags sont correctement fermés. Alors vous pouvez utiliser PHP pour faire ça :</p>
<pre class="brush:php">
  $codeUtilisateur = '&lt;p>&lt;b>Mon texte&lt;/b>'; // il manque '&lt;/p>'
  $doc = new DOMDocument(); // on utilise DOMDocument qui est installé par défaut avec PHP
  $doc->loadHTML($codeUtilisateur);
  $codeRetour = preg_replace('~&lt;(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $doc->saveHTML()); // on va obtenir : '&lt;p>&lt;b>Mon texte&lt;/b>&lt;/p>'
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2013/06/13/verifier-du-code-html-en-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Permettre le retour en arrière sur une page PHP avec une session [programmation]</title>
		<link>https://blog.kodono.info/wordpress/2012/03/15/permettre-le-retour-en-arriere-sur-une-page-php-avec-une-session-programmation/</link>
					<comments>https://blog.kodono.info/wordpress/2012/03/15/permettre-le-retour-en-arriere-sur-une-page-php-avec-une-session-programmation/#comments</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Thu, 15 Mar 2012 10:59:05 +0000</pubDate>
				<category><![CDATA[Navigateur]]></category>
		<category><![CDATA[Niveau intermédiaire]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://blog.kodono.info/wordpress/?p=960</guid>

					<description><![CDATA[Si vous utilisez les sessions avec PHP et que vous avez un formulaire qui fait du POST, alors le retour en arrière (en utilisant le bouton du navigateur) risque de retourner une page blanche avec un message d&#8217;erreur du style &#8220;Le document a expiré&#8221;. Après avoir fouillé la documentation PHP pour session_cache_limiter, j&#8217;ai découvert qu&#8217;il [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Si vous utilisez les sessions avec PHP et que vous avez un formulaire qui fait du POST, alors le retour en arrière (en utilisant le bouton du navigateur) risque de retourner une page blanche avec un message d&#8217;erreur du style &#8220;Le document a expiré&#8221;.</p>
<p>Après avoir fouillé la documentation PHP pour <a href="http://www.php.net/manual/fr/function.session-cache-limiter.php#82048" title="Lien vers la documentation de PHP">session_cache_limiter</a>, j&#8217;ai découvert qu&#8217;il suffit d&#8217;ajouter <code>session_cache_limiter('private_no_expire, must-revalidate');</code> au tout début du fichier, avant quoi que ce soit. Et maintenant le retour en arrière fonctionne !</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2012/03/15/permettre-le-retour-en-arriere-sur-une-page-php-avec-une-session-programmation/feed/</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		
			</item>
		<item>
		<title>Stocker un mot de passe en PHP grâce à bcrypt [sécurité]</title>
		<link>https://blog.kodono.info/wordpress/2011/08/08/stocker-un-mot-de-passe-en-php-grace-a-bcrypt-securite/</link>
					<comments>https://blog.kodono.info/wordpress/2011/08/08/stocker-un-mot-de-passe-en-php-grace-a-bcrypt-securite/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Mon, 08 Aug 2011 17:53:00 +0000</pubDate>
				<category><![CDATA[Niveau intermédiaire]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://blog.kodono.info/wordpress/?p=657</guid>

					<description><![CDATA[[niveau: intermédiaire] Il a été démontré que le stockage de mot de passe n&#8217;est pas chose aisée, et que l&#8217;utilisation d&#8217;une méthode de hashage (MD5, SHA-1, etc) n&#8217;est pas parfaite, même avec l&#8217;utilisation d&#8217;un salt. D&#8217;après cette constatation plusieurs articles indiquent que la meilleure méthode reste l&#8217;utilisation de bcrypt, comme on peut le lire dans [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>[niveau: intermédiaire]</p>
<p>Il a été démontré que le stockage de mot de passe n&#8217;est pas chose aisée, et que l&#8217;utilisation d&#8217;une méthode de hashage (MD5, SHA-1, etc) n&#8217;est pas parfaite, même avec l&#8217;utilisation d&#8217;un <em>salt</em>. D&#8217;après cette constatation plusieurs articles indiquent que la meilleure méthode reste l&#8217;utilisation de <code>bcrypt</code>, comme on peut le lire dans <a href="http://codahale.com/how-to-safely-store-a-password/">How to safely store a password</a>.</p>
<p>L&#8217;utilisation de <code>bcrypt</code> est assez simple :<br />
1) Télécharger <a href="http://www.openwall.com/phpass/">phpass</a> (fichier .tgz qui contient un fichier <strong>PasswordHash.php</strong>);<br />
2) Appeler <em>PasswordHash.php</em> dans votre page :</p>
<pre class="brush:php">&lt;?php require('includes/PasswordHash.php'); ?></pre>
<p>3) Maintenant vous pouvez utiliser l&#8217;objet PasswordHash comme cela :</p>
<pre class="brush:php">&lt;?php
$password = $_POST["password"];
$hasher = new PasswordHash(8, FALSE);
$hash = $hasher->HashPassword($password);
?></pre>
<p>Et pour vérifier un mot de passe, vous devez utiliser ce petit bout de code :</p>
<pre class="brush:php">&lt;?php // vérification du mot de passe
$password = $_POST["password"];
$password_correct = "password qui vient de la base de données"; /* Le hash stocké précédemment */
$hasher = new PasswordHash(8, FALSE);
$check = $hasher->CheckPassword($password, $password_correct);

if ($check) {
 echo "Password correct!";
}
else {
 echo "Password incorrect...";
}
?></pre>
<p>A noter que si vous souhaitez le rendre compatible avec d&#8217;autres systèmes équivalents (comme <a href="http://www.mindrot.org/projects/jBCrypt/">BCrypt pour Java</a> par exemple), alors il faudra vous assurer que votre machine a bien CRYPT_BLOWFISH d&#8217;installé (on peut le voir avec <code>&lt;?php echo CRYPT_BLOWFISH; ?&gt;</code>) afin d&#8217;avoir une bonne compatibilité des deux systèmes.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2011/08/08/stocker-un-mot-de-passe-en-php-grace-a-bcrypt-securite/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Les widgets de la sidebar WordPress ne se sauvegardent pas [WordPress]</title>
		<link>https://blog.kodono.info/wordpress/2011/02/19/probleme-widgets-sidebar-wordpress-non-sauvegardes/</link>
					<comments>https://blog.kodono.info/wordpress/2011/02/19/probleme-widgets-sidebar-wordpress-non-sauvegardes/#comments</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Sat, 19 Feb 2011 11:20:16 +0000</pubDate>
				<category><![CDATA[Niveau intermédiaire]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">http://blog.kodono.info/wordpress/?p=520</guid>

					<description><![CDATA[[niveau: intermédiaire] Vous utilisez WordPress et avez choisi un des nombreux thèmes gratuits qu&#8217;on trouve sur le Net. Et puis vous souhaitez utiliser la barre latérale (&#8220;sidebar&#8221;) pour afficher dynamiquement des widgets comme WordPress le permet ? Cependant vous remarquez que même en cliquant sur &#8220;Save&#8221;, les widgets ajoutés ne se sauvegardent jamais&#8230; Tout d&#8217;abord [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>[niveau: intermédiaire]</p>
<p>Vous utilisez WordPress et avez choisi un des nombreux thèmes gratuits qu&#8217;on trouve sur le Net. Et puis vous souhaitez utiliser la barre latérale (&#8220;sidebar&#8221;) pour afficher dynamiquement des widgets comme WordPress le permet ? Cependant vous remarquez que même en cliquant sur &#8220;Save&#8221;, les widgets ajoutés ne se sauvegardent jamais&#8230;</p>
<p>Tout d&#8217;abord vous devez aller vérifier le fichier sidebar.php (&#8220;Barre latérale&#8221;) dans l&#8217;éditeur de votre thème.<br />
Voici un exemple de ce que vous devriez avoir:</p>
<pre class="brush:php">&lt;ul id="sidebar"&gt;
&lt;?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar() ) : ?&gt;
 &lt;li id="about"&gt;
  &lt;h2&gt;About&lt;/h2&gt;
  &lt;p&gt;This is my blog.&lt;/p&gt;
 &lt;/li&gt;
 &lt;li id="links"&gt;
  &lt;h2&gt;Links&lt;/h2&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href="http://example.com"&gt;Example&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
 &lt;/li&gt;
&lt;?php endif; ?&gt;
&lt;/ul&gt;</pre>
<p>C&#8217;est le code par défaut <strong>qui fonctionne</strong> pour que la sidebar s&#8217;affiche correctement. Vous devriez donc d&#8217;abord tester en insérant ce code là. On notera que s&#8217;il n&#8217;y a pas de widgets, alors la barre affichera les deux éléments définis par défaut (ici &#8220;About&#8221; et &#8220;Links&#8221;).</p>
<p>Maintenant, il suffit d&#8217;activer la sidebar dans le fichier &#8220;functions.php&#8221; de votre thème. Pour cela, voici le code que vous devriez avoir dans ce fichier :</p>
<pre class="brush:php">&lt;?php
if ( function_exists('register_sidebar') )
    register_sidebar();
?&gt;</pre>
<p>C&#8217;est tout, seulement ces quatre lignes. Il dit à WordPress qu&#8217;il doit activer une sidebar. Maintenant, les widgets doivent pouvoir s&#8217;ajouter et se sauvegarder sans problème.</p>
<p>Supposons maintenant que vous ne voulez pas utiliser le code par défaut, mais que vous voulez une barre latérale un peu plus personnalisée.<br />
Voici un exemple avec des <em>div</em> :</p>
<pre class="brush:php">&lt;div id="sidebar"&gt;
&lt;?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar() ) : ?&gt;
 &lt;div class="mywidget"&gt;
  &lt;h2 class="title"&gt;About&lt;/h2&gt;
  &lt;p&gt;This is my blog.&lt;/p&gt;
 &lt;/div&gt;
 &lt;div class="mywidget"&gt;
  &lt;h2 class="title"&gt;Links&lt;/h2&gt;
  &lt;ul&gt;
   &lt;li&gt;&lt;a href="http://example.com"&gt;Example&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
 &lt;/div&gt;
&lt;?php endif; ?&gt;
&lt;/div&gt;</pre>
<p>Et le code associé à mettre dans le fichier functions.php :</p>
<pre class="brush:php">&lt;?php
if ( function_exists('register_sidebar') )
    register_sidebar(array(
        'before_widget' =&gt; '&lt;div class="monwidget"&gt;',
        'after_widget' =&gt; '&lt;/div&gt;',
        'before_title' =&gt; '&lt;h2 class="title"&gt;',
        'after_title' =&gt; '&lt;/h2&gt;',
    ));
?&gt;</pre>
<p>Maintenant vos widgets devraient s&#8217;enregistrer sans problème !</p>
<p>(Source: <a href="http://automattic.com/code/widgets/themes/">http://automattic.com/code/widgets/themes/</a>)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2011/02/19/probleme-widgets-sidebar-wordpress-non-sauvegardes/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Utiliser la fonction mail() de PHP avec exim4 [Linux]</title>
		<link>https://blog.kodono.info/wordpress/2009/12/10/utiliser-la-fonction-mail-de-php-avec-exim4-linux/</link>
					<comments>https://blog.kodono.info/wordpress/2009/12/10/utiliser-la-fonction-mail-de-php-avec-exim4-linux/#comments</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Thu, 10 Dec 2009 10:51:20 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Niveau intermédiaire]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://blog.kodono.info/wordpress/?p=383</guid>

					<description><![CDATA[[niveau intermédiaire] Si vous utilisez une Debian ainsi que PHP, vous voulez certainement pouvoir envoyer des emails grâce à la fonction mail() qu&#8217;offre le langage. Pour cela, on va utiliser exim4 qui est en général déjà installé sur votre Debian toute fraiche (normalement vous avez également /usr/sbin/sendmail qui redirige sur /usr/sbin/exim4). Si vous n&#8217;avez pas [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>[niveau intermédiaire]</p>
<p>Si vous utilisez une Debian ainsi que PHP, vous voulez certainement pouvoir envoyer des emails grâce à la fonction <em>mail()</em> qu&#8217;offre le langage. Pour cela, on va utiliser <b>exim4</b> qui est en général déjà installé sur votre Debian toute fraiche (normalement vous avez également /usr/sbin/sendmail qui redirige sur /usr/sbin/exim4). Si vous n&#8217;avez pas <b>exim</b> d&#8217;installé, je vous invite à aller lire <a href="http://www.paperblog.fr/576185/installer-l-envoi-de-mails-depuis-son-site-la-fonction-php-mail/">ce billet de Paperblog</a>.</p>
<p>Par défaut <b>exim4</b> est configuré pour n&#8217;envoyer les emails qu&#8217;aux utilisateurs locaux. Pour modifier ce comportement, vous devez modifier le fichier <b>/etc/exim4/update-exim4.conf.conf</b> en mettant :</p>
<div class="code">dc_eximconfig_configtype=&#8217;internet&#8217;</div>
<p>Redémarrer <b>exim4</b> et vous devriez maintenant pouvoir envoyer des emails au monde entier. Attention cependant de bien bloquer le port 25 de votre machine au monde extérieur (mais pas en local) afin d&#8217;éviter que quiconque puisse utiliser votre serveur SMTP.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2009/12/10/utiliser-la-fonction-mail-de-php-avec-exim4-linux/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Tester des expressions régulières (RegExp) en ligne [Programmation]</title>
		<link>https://blog.kodono.info/wordpress/2009/05/06/tester-des-expressions-regulieres-regexp-en-ligne-programmation/</link>
					<comments>https://blog.kodono.info/wordpress/2009/05/06/tester-des-expressions-regulieres-regexp-en-ligne-programmation/#respond</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Wed, 06 May 2009 11:40:35 +0000</pubDate>
				<category><![CDATA[Niveau expert]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regexp]]></category>
		<guid isPermaLink="false">http://blog.kodono.info/wordpress/?p=123</guid>

					<description><![CDATA[[niveau: expert] Vous connaissez certainement les RegExp. Lumadis.be propose de tester nos expressions régulières en utilisant les fonctions PHP preg_match, preg_match_all et ereg. Un outil en ligne bien pratique pour ces expressions parfois difficiles à formater ! EDIT: on notera aussi l&#8217;existence de cet autre outils en ligne très complet : http://gskinner.com/RegExr/]]></description>
										<content:encoded><![CDATA[<p>[niveau: expert]</p>
<p>Vous connaissez certainement les <a href="http://www.expreg.com/">RegExp</a>. Lumadis.be propose de <a href="http://lumadis.be/regex/test_regex.php?lang=fr">tester nos expressions régulières</a> en utilisant les fonctions PHP <em>preg_match</em>, <em>preg_match_all</em> et <em>ereg</em>.</p>
<p>Un outil en ligne bien pratique pour ces expressions parfois difficiles à formater !</p>
<p><b>EDIT</b>: on notera aussi l&#8217;existence de cet autre outils en ligne très complet : <a href="http://gskinner.com/RegExr/">http://gskinner.com/RegExr/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2009/05/06/tester-des-expressions-regulieres-regexp-en-ligne-programmation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Débogage Javascript et PHP dans Firebug [Programmation]</title>
		<link>https://blog.kodono.info/wordpress/2009/04/16/debogage-javascript-et-php-dans-firebug-programmation/</link>
					<comments>https://blog.kodono.info/wordpress/2009/04/16/debogage-javascript-et-php-dans-firebug-programmation/#comments</comments>
		
		<dc:creator><![CDATA[Aymeric]]></dc:creator>
		<pubDate>Thu, 16 Apr 2009 06:28:47 +0000</pubDate>
				<category><![CDATA[Debug]]></category>
		<category><![CDATA[Navigateur]]></category>
		<category><![CDATA[Niveau expert]]></category>
		<category><![CDATA[extensions]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">http://blog.kodono.info/wordpress/?p=55</guid>

					<description><![CDATA[[niveau: expert] Sur l&#8217;excellent blog Ajaxian je viens de découvrir qu&#8217;il existe un plugin au module Firebug (dont je parlais justement hier) qui permet de déboguer du PHP en console ! Cette petite merveille se nomme FirePHP et m&#8217;a l&#8217;air prometteur au vue des images: Je ne code actuellement pas en PHP, mais je dois [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>[niveau: expert]</p>
<p>Sur l&#8217;excellent blog <a href="http://ajaxian.com/archives/firephp-tying-together-firebug-and-php">Ajaxian</a> je viens de découvrir qu&#8217;il existe un plugin au module Firebug (<a href="http://blog.kodono.info/wordpress/2009/04/15/les-extensions-a-avoir-firefox/">dont je parlais justement hier</a>) qui permet de déboguer du PHP en console ! Cette petite merveille se nomme <a href="http://www.christophdorn.com/Blog/2009/04/03/how-to-integrate-firephp-for-ajax-development/">FirePHP</a> et m&#8217;a l&#8217;air prometteur au vue des images:<br />
<img fetchpriority="high" decoding="async" src="http://blog.kodono.info/wordpress/wp-content/uploads/2009/04/20090416_firephp.png" alt="firephp" title="firephp" width="422" height="457" class="aligncenter size-full wp-image-56" srcset="https://blog.kodono.info/wordpress/wp-content/uploads/2009/04/20090416_firephp.png 422w, https://blog.kodono.info/wordpress/wp-content/uploads/2009/04/20090416_firephp-277x300.png 277w" sizes="(max-width: 422px) 100vw, 422px" /></p>
<p>Je ne code actuellement pas en PHP, mais je dois bientôt retravailler sur un projet avec ce langage, je pourrai alors vous en dire un peu plus !</p>
<p>A noter qu&#8217;il existe d&#8217;autres moyens de débugguer, comme <a href="http://particletree.com/features/php-quick-profiler/">PHP Quick Profiler (en)</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.kodono.info/wordpress/2009/04/16/debogage-javascript-et-php-dans-firebug-programmation/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
