Marc Reymond   -  PHP/MySQL
Trucs et astuces


  • Cette page me sert de bloc-notes pour des trucs, astuces, scripts, fonction, etc., que j'utilise dans mes pages. Comme ça, je sais où c'est et je peux les réutiliser facilement...
  • Si cela peut servir à quelqu'un d'autre, tant mieux !
  • Et si vous voyez des améliorations à apporter, n'hésitez pas à me les communiquer: php at interdoc dot ch.


 

 

 

Une fonction récursive pour construire des menus hiéarchiques
  • Peut être utilisée pour construire une arborescence à partir d'une base de données MySQL.
    Par exemple: nous avons une table MySQL menu qui contient les rubriques de mon site internet, organisées de manière hiérarchie:
    idnomassociationurl
    1Photosp1.php
    2Nature1p2.php
    3Paysages1p3.php
    4Arbres2p4.php
    5Italie3p5.php
    6France3p6.php
    7Projetsp7.php
    8Projets de type 17p8.php

    La valeur contenue dans association indique à quel enregistrement la fiche est subordonnée.
    Nous voulons arriver à un menu de type:
  • Photos
  • Projets


  • Un simple appel de la fonction ci-dessous va construire l'arborescence, quelque soit le nombre de niveaux.
    >>> menuiter2("bd.table",'');
<?php
// fonction récursive pour construire des menus hiérarchisés

    
function menuiter2 ($table_menu,$sql)
    {
    static 
$i=0;
            if (
$i==0)
            {
            
// requête pour trouver les menus principaux (association=0 ou est vide)
            
$sql0="SELECT id,nom, association,url FROM $table_menu WHERE (association=0) OR (association IS NULL) OR (association='') ORDER BY id";
            
$sql=$sql0;
            }
    
// WHILE
        
$nom_sql='r'.$i;
        $
$nom_sql=mysql_query($sql);
        
$menu='mid'.$i;
        
$asso='association'.$i;
        
$url ='url'.$i;
        
$nom ='nom'.$i;
            while (list($
$menu,$$nom,$$asso,$$url) = mysql_fetch_row ($$nom_sql)) 
            {
            
$i++;
                    
$sql_id =' SELECT id,nom, association,url FROM '.$table_menu.' WHERE ';
                    
$sql_id.=' association='.$$menu;
                    
$sql_id.=' ORDER BY id ';
                    
                    
$r_id='r'.$i;
                    $
$r_id=mysql_query($sql_id);
                        
                    if (
mysql_num_rows($$r_id)>0)
                    {
                    echo 
"\n".'<li><a class="submen" href="'.$$url.'">'.$$nom.'</a><ul>'."\n";
                    
// on rapelle la fonction pour avoir les menus subordonnées
                    
menuiter2($table_menu,$sql_id);
                    echo 
'</ul>'."\n".'</li>'."\n";
                    }
                    else
                    echo 
"\n".'<li><a class="submen" href="'.$$url.'">'.$$nom.'</a></li>'."\n";
                    }
            }
?>

 

 

 

 

Une fonction pour modifier un champ MySQL de type ENUM
  • Peut être utilisée pour modifier un champ de type ENUM.
    Par exempe : si l'utilisateur a le choix entre sélectionner une valeur existante dans un champ select et un autre champ où il peut entrer une nouvelle valeur.
    Cette nouvelle valeur doit d'abord être ajoutée dans la liste du champ ENUM. La fonction requière le nom de la table, le nom du champ ENUM et la nouvelle valeur.

  • OU
<?
//==========================================================
# ajoute une nouvelle valeur à un champ enum
    
function ajoute_enum($nom_table$nom_champ$nouveau_enum)
    {
        
$r=mysql_fetch_assoc(mysql_query("SHOW COLUMNS FROM $nom_table LIKE '$nom_champ'"));
    
$type=$r['Type'];
    
$type=substr($type,0,-1);
    
$type=$type.',\''.$nouveau_enum.'\')';
    
$r=mysql_query("ALTER TABLE $nom_table CHANGE `$nom_champ` `$nom_champ` $type CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL");
    }
//==========================================================




        
if ($nouvellevaleur<>'Nouvelle valeur' AND $nouvellevaleur<>'')
                
ajoute_enum($table_mysql'champ_valeur',$nouvellevaleur);
    
    
$nouveau=mysql_query("INSERT INTO $table_mysql VALUES ('3','Chose','$nouvellevaleur')");

?>

 

 

 

 

Un formulaire pour remplir une base de données MySQL avec des dates, par exemple pour faire un calendrier
  • On indique simplement le nombre de jours que l'on veut rajouter
<html>
<head>
</head>
<body>
Indiquez le nombre de jours à ajouter: 
<form name="nbre_jours" method="post" action="<?php $_SERVER['PHP_SELF'];?>">
    <input type="text" name="nombre_de_jours">
</form>


<?php

if ($_POST['nombre_de_jours'])
{
        
$mysql_host="xxxxxx";
        
$mysql_base="xxxxxx";
        
$mysql_table="xxxxxx";
        
$mysql_user="xxxxxx";
        
$mysql_psswd="xxxxxx";

        
$link mysql_connect($mysql_host$mysql_user$mysql_psswd) or die ("");
        
mysql_select_db ($mysql_base) or die ("");


    
// on commence par trouver la date la plus grande, qui servira de point de départ
        
$sql=mysql_query("SELECT UNIX_TIMESTAMP(MAX(delai)) AS delai_max FROM $mysql_table");
        
$row=mysql_fetch_row($sql);
        
$t0=$row[0];

    
//le nombre d'enregistrements que l'on veur créer:
        
$how_much_days=$nombre_de_jours;


    
// la boucle qui remplit la base de données
        
for ($i=0;$i<$how_much_days;$i++)
        {
        
$t0=$t0+86400;
        
$a_d=date("Y",$t0);
        
$m_d=date("m",$t0);
        
$j_d=date("d",$t0);

            
$bool=checkdate($m_d,$j_d,$a_d);
            if (
$bool)
            {
            
$date_db=$a_d."-".$m_d."-".$j_d;
            
$resultmysql_query("INSERT INTO $mysql_table VALUES ('','','$date_db','')");
            echo 
$i.'<br/>';
            }
        }
    
}
?>

</body>
</html>

 

 

 

 

Avoir la date au format français (3 décembre 2005) en partant d'une date MySQL (2005-12-03)
<?php


// on paramètre php pour que les dates soient dans un format français
    
setlocale (LC_TIME'fr_FR.ISO8859-1');



// on récupère le timestamp UNIX du champ date

    
$resultmysql_query("SELECT date,UNIX_TIMESTAMP(date) FROM ma_table");

    while (list(
$date,$date_unix) = mysql_fetch_row ($result)) 
    {
    
// et on a la date au format: 3 décembre 2005    
        
$date_fr=strftime('%e %B %Y',$date_unix);
    }
?>

 

 

 

 

Afficher toutes les tables d'une base de données MySQL, avec leurs champs et la description des champs
  • Ce petit script permet d'afficher dans une page web les tables d'une BD. Cela permet à d'autres utilisateurs de voir la structure des tables; des fois, pour le webmaster, c'est plus simple d'aller sur cette page que de passer par phpMyAdmin.
<?php
$t
="ma_base_MySQL";


$link mysql_connect("host""username""password") or die ("Impossible de se connecter");
    
mysql_select_db ($t) or die ("Impossible d'accéder à la base de données");




    
$toutes_les_tables=mysql_query("SHOW tables from $t");
    
$nombre=mysql_num_rows($toutes_les_tables);


    print (
"<h3>$nombre tables dans <u>$t</u></h3>");
    print (
"<hr/>");

    print (
"<table width=\"99%\" cellspacing=\"10\">");
        print (
"<tr>");
            print (
"<td>");

            while(
$row mysql_fetch_array($toutes_les_tables))
            {
            print (
"<a href=\"$_PHP['SELF']?nom_table=$row[0]&t=$t\">$row[0]</a><br/>");
            }    
            print (
"</td>");




    if (
$nom_table<>""
    {
            print (
"<td valign=\"top\">");
            print (
"<h2>$nom_table</h2>");

            
$result=mysql_query("DESCRIBE $nom_table");

            print(
"<table border=\"1\">");

            while(
$row mysql_fetch_array($result))
            {
            print (
"<tr>");
                print (
"<td width=\"130\"> $row[0] </td><td> $row[1] </td><td>$row[2]</td><td>$row[3]</td><td>$row[4]</td>");
            print (
"</tr>");
            }
            print (
"</td>");
    }
        print (
"</tr>");
    print (
"</table>");

?>

 

 

 

 

Créer un menu déroulant pour un formulaire à partir d'un champ de type ENUM
  • Cette fonction sert à créer un menu déroulant pour un champ de type ENUM (par exemple: ('0','1','2','3'). Il ne serait pas judicieux de réécrire les valeurs possibles du champ en html, car en cas de changement il faudrait répercuter la modification dans deux endroits (MySQL et le code HTML).
    Voici donc une fonction avec deux paramètre: le nom du champ dont il faut prendre les valeurs et le nom de la table où se trouve ce champ.
    La fonction renvoie par exemple <option value=\"0\">0</option><option value=\"1\">1</option> ... , qu'il suffit de mettre entre les balises SELECT.
<?php
//==========================================================
//requête MYSQL pour construire les menus déroulants à partir d'un champ de type ENUM

function menu_deroulant($nom_champ,$nom_table)
    {
    
$result_menu_deroulant=mysql_query("DESCRIBE $nom_table");
        while (
$row=mysql_fetch_assoc($result_menu_deroulant))
        {
        
$field=$row['Field'];//field contient le nom du champ
        
$type=$row['Type'];//type contient le type du champ
        
if ((substr($type,0,4)=="enum") AND ($field==$nom_champ))
            {
            
$type=substr($type,5);
            
$type_2=explode(",",$type);
            for (
$i=0;$i<count($type_2);$i++)
                {
                
$type_2[$i]=ereg_replace("'","",$type_2[$i]);
                
$type_2[$i]=ereg_replace(")","",$type_2[$i]);
                
$nom_var_select=$field."_select";
                $
$nom_var_select=$$nom_var_select."<option value=\"$type_2[$i]\">$type_2[$i]</option>\r\n";
                }
            }
        }
    return $
$nom_var_select;
    }
//==========================================================
?>

 

 

 

 

Créer un formulaire à choix multiples à partir d'un champ de type SET
  • Ces quelques lignes servent à créer automatiquement un menu à choix multiples à partir d'un champ de type SET.
    Dans notre exemple, le champ de type SET s'appelle categorie.
    Le champ du formulaire affiche toutes les valeurs possibles.
    Après quoi on récupère ce qui a été posté par l'utilisateur.
<?php
//==========================================================

// LE FORMULAIRE


print ("<table>");
print (
"<tr><td>Catégorie</td><td><select name=\"categorie[]\" size=\"6\" multiple=\"true\"><option value=\"\"></option>");
     
$result=mysql_query("DESCRIBE $table_documents");
               while(
$row mysql_fetch_array($result))
               {
     if (
$row[0]=='categorie')
     {
     
$enumeration=substr($row[1],4);
     
$enumeration=substr($enumeration,0,-1);
     
$enumeration=str_replace("\'","",$enumeration);
     
$enumeration=explode(",",$enumeration);
     for (
$i=0;$i<count($enumeration);$i++)
     print (
"<option value=\"$enumeration[$i]\">$enumeration[$i]</option>");     
               }
     }
    print (
"</select>");
 print (
"</td></tr>");
 print (
"</table>");
//==========================================================



// POUR RECUPRER LA VALEUR DU CHAMP categorie:

if ($_POST)
while(list(
$key,$val)=each($_POST['categorie'])) if ($val$categorie=$categorie.','.$val;

// maintenant on peut faire la mise à jour avec mysql_query("UPDATE .... SET categorie='$categorie' WHERE .... ");


?>

 

 

 

 

Contrôler un numéro de référence de type BVRB
  • Il s'agit de voir si un numéro de référence est valide; le dernier chiffre du numéro de référence d'un bulletin de versement sert de caractère de contrôle.
  • Pour faire le calcul, il faut introduire toutes les valeurs des cellules d'un tableau qui sert à trouver le chiffre-clé.
  • La fonction suivante retourne true si la référence est valide et false si elle ne l'est pas.
<?php
# contrôle un numéro de référence d'un bulletin de verserment avec numéro de référence bancaire


# pour contrôler un numéro BVRB
#==============================

    
function controle_bvrb ($bvrb)
    {


    
$tableau[0][0]=0;
    
$tableau[0][1]=9;
    
$tableau[0][2]=4;
    
$tableau[0][3]=6;
    
$tableau[0][4]=8;
    
$tableau[0][5]=2;
    
$tableau[0][6]=7;
    
$tableau[0][7]=1;
    
$tableau[0][8]=3;
    
$tableau[0][9]=5;
    
$tableau[0][10]=0;

    
$tableau[1][0]=9;
    
$tableau[1][1]=4;
    
$tableau[1][2]=6;
    
$tableau[1][3]=8;
    
$tableau[1][4]=2;
    
$tableau[1][5]=7;
    
$tableau[1][6]=1;
    
$tableau[1][7]=3;
    
$tableau[1][8]=5;
    
$tableau[1][9]=0;
    
$tableau[1][10]=9;

    
$tableau[2][0]=4;
    
$tableau[2][1]=6;
    
$tableau[2][2]=8;
    
$tableau[2][3]=2;
    
$tableau[2][4]=7;
    
$tableau[2][5]=1;
    
$tableau[2][6]=3;
    
$tableau[2][7]=5;
    
$tableau[2][8]=0;
    
$tableau[2][9]=9;
    
$tableau[2][10]=8;

    
$tableau[3][0]=6;
    
$tableau[3][1]=8;
    
$tableau[3][2]=2;
    
$tableau[3][3]=7;
    
$tableau[3][4]=1;
    
$tableau[3][5]=3;
    
$tableau[3][6]=5;
    
$tableau[3][7]=0;
    
$tableau[3][8]=9;
    
$tableau[3][9]=4;
    
$tableau[3][10]=7;

    
$tableau[4][0]=8;
    
$tableau[4][1]=2;
    
$tableau[4][2]=7;
    
$tableau[4][3]=1;
    
$tableau[4][4]=3;
    
$tableau[4][5]=5;
    
$tableau[4][6]=0;
    
$tableau[4][7]=9;
    
$tableau[4][8]=4;
    
$tableau[4][9]=6;
    
$tableau[4][10]=6;

    
$tableau[5][0]=2;
    
$tableau[5][1]=7;
    
$tableau[5][2]=1;
    
$tableau[5][3]=3;
    
$tableau[5][4]=5;
    
$tableau[5][5]=0;
    
$tableau[5][6]=9;
    
$tableau[5][7]=4;
    
$tableau[5][8]=6;
    
$tableau[5][9]=8;
    
$tableau[5][10]=5;

    
$tableau[6][0]=7;
    
$tableau[6][1]=1;
    
$tableau[6][2]=3;
    
$tableau[6][3]=5;
    
$tableau[6][4]=0;
    
$tableau[6][5]=9;
    
$tableau[6][6]=4;
    
$tableau[6][7]=6;
    
$tableau[6][8]=8;
    
$tableau[6][9]=2;
    
$tableau[6][10]=4;

    
$tableau[7][0]=1;
    
$tableau[7][1]=3;
    
$tableau[7][2]=5;
    
$tableau[7][3]=0;
    
$tableau[7][4]=9;
    
$tableau[7][5]=4;
    
$tableau[7][6]=6;
    
$tableau[7][7]=8;
    
$tableau[7][8]=2;
    
$tableau[7][9]=7;
    
$tableau[7][10]=3;

    
$tableau[8][0]=3;
    
$tableau[8][1]=5;
    
$tableau[8][2]=0;
    
$tableau[8][3]=9;
    
$tableau[8][4]=4;
    
$tableau[8][5]=6;
    
$tableau[8][6]=8;
    
$tableau[8][7]=2;
    
$tableau[8][8]=7;
    
$tableau[8][9]=1;
    
$tableau[8][10]=2;

    
$tableau[9][0]=5;
    
$tableau[9][1]=0;
    
$tableau[9][2]=9;
    
$tableau[9][3]=4;
    
$tableau[9][4]=6;
    
$tableau[9][5]=8;
    
$tableau[9][6]=2;
    
$tableau[9][7]=7;
    
$tableau[9][8]=1;
    
$tableau[9][9]=3;
    
$tableau[9][10]=1;
    
    
    
# contrôle::::::::::::::::::::::::::
    #-----------------------------------
        
$bv=str_replace(' ','',$bvrb);
        
$report=0;        
        
        while(
strlen($bv)>1)
            {
            
$match=substr($bv,0,1);
            
$report=$tableau[$report][$match];
            
$bv=substr($bv,1);
            }
        
$controle=$tableau[$report][10];
        
        if (
$controle==$bv)
            return 
true;
        else
            return 
false;
        
    }

?>