alternative à parse_str sans limitation

Bon c’est un peu technique mais la fonction PHP parse_str est limité par la directive max_input_vars ce qui fait que par défaut on ne peut traiter que 1000 paramètres avec cette fonction.

Comme j’ai eu besoin d’en traiter plus que ça voici une réécriture de parse_str sans limitation. Elle supporte les tableaux imbriqués et c’est déjà pas mal.

/**
 * do the same than parse_str without max_input_vars limitation
 * @param $string array string to parse
 * @return  array query parsed
 **/
function my_parse_str($string) {
    $result = array();
    // find the pairs "name=value"
    $pairs = explode('&', $string);
    $toEvaluate = ''; // we will do a big eval() at the end not pretty but simplier
    foreach($pairs as $pair) {
        list($name, $value) = explode('=', $pair, 2);
        $name = urldecode($name);
        if (strpos($name, '[') !== false) { // name is an array
            $name = preg_replace('|\[|', '][', $name, 1);
            $name = str_replace(array('\'', '[', ']'), array('\\\'', '[\'', '\']'), $name);
            $toEvaluate .= '$result[\''.$name.' = '.urldecode($value).'; '; // $result['na']['me'] = 'value';               
        }
        else {
            $name = str_replace('\'', '\\\'', $name);
            $toEvaluate .= '$result[\''.$name.'\'] = '.urldecode($value).'; '; // $result['name'] = 'value';
        }
    }
    eval($toEvaluate);
    return $result;
}

$array = my_parse_str($query);

Détecter un module apache avec PHP

Utile pour détecter le mod_evasive par exemple.

/**
 * return true if the module $name is activated in apache
 *
 * @param string $name module name
 * @return boolean
 * @author Samdha
 **/
function detect_apache_mod($name) {
    $save = ob_get_clean();
    ob_start();
    phpinfo();
    $phpinfo = ob_get_clean();
    if ($save !== false) {
        ob_start();
        echo $save;
    }
    return (strpos($phpinfo, $name) !== false);
}
    
if (detect_apache_mod('mod_evasive')) sleep(1);

Utilisé dans le module Prestashop de mise à jour facile

Convertir une date excel en timestamp

Avec PHP-ExcelReader, on se retrouve parfois avec des timestamps Excel au lieu de date. Voici comment les convertir en timestamps unix.

    $timestampExcel = 40544;
    $timestampUnix = 86400*($timestampExcel - 25569);
    echo date('Y-m-d', $timestampUnix); // 2011-01-01

Forcer index.php avec Wordpress

Wordpress a une mauvaise habitude : si vous allez à la racine de votre blog en tapant http://www.example.com/index.php, il vous redirigera vers http://www.example.com/ . De même http://www.example.com/index.php?cat=1 est redirigé vers http://www.example.com/?cat=1 .

En général c’est une bonne chose : tout le monde s’en fout, l’URL est plus petite et personne n’a besoin de savoir que votre site est en PHP.

Par contre si vous avez un fichier index.html c’est très génant : impossible de visiter votre blog, on retombe toujours vers index.html puisque c’est la page par défaut sur la plupart des serveurs.

Donc voici comment faire pour forcer l’utilisation de index.php dans les URL :

Fichier wp-includes/link-template.php ligne 1869

    $url .= '/' . ltrim( $path, '/' );

devient

    $url .= '/' . ltrim( 'index.php'.$path, '/' );

Fichier wp-includes/canonical.php ligne 58

//$original['path'] = preg_replace('|/index\.php$|', '/', $original['path']);

devient

$original['path'] = preg_replace('|/index\.php$|', '/', $original['path']);