1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| <?php
error_reporting(E_ALL);
try {
// connexion
$conn = new PDO('mysql:host=127.0.0.1;dbname=stageoff','stageoff','mdp');
$conn->exec('SET NAMES utf8');
// les attributs ATTR_ERRMODE et ERRMODE_EXCEPTION permettent de provoquer
// des messages d'erreurs lorsqu'il y a un problème de requête SQL
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e) {
// affiche les éventuels messages d'erreurs relatifs à la connexion
die(print_r('Erreur : ' . $e->getMessage()));
}
//tableau destiné à recevoir les différentes conditions de recherche
$conditions = array();
//transforme le json en tableau associatif (true indique que l'on veut un tableau associatif)
$ligne = json_decode($_POST['to_send'],true);
//parcours de mon tableau associatif nomme $ligne
foreach($ligne as $field => $value)
{
if(trim($value) != '')
{
if($field == 'officine.adresse')
{
//'%'.$value.'%' permet de sélectionner une partie de l'adresse n'importe où dans la chaine (pas seulement au début)
$conditions[] = array($field, 'LIKE', '%'.$value.'%');
}
elseif($field == "officine.ref_code_postal")
{
$min_max = explode('-',$value);
$conditions[] = array($field, 'BETWEEN', $min_max[0].' AND '.$min_max[1]);
}
elseif($field == "officine.pays")
{
$conditions[] = array($field, '=', $value);
}
else
{
$conditions[] = array($field, 'LIKE', $value);
}
}
}
// Préparation de la chaîne SQL pour pouvoir utiliser une requête préparée avec des conditions dynamiques
$chaine = 'SELECT ref_agrement, pharmacien.id, pharmacien.nom, pharmacien.prenom, officine.adresse, officine.pays, officine.ref_code_postal, SUBSTR(date_debut, 1, 4) ';
$chaine.= 'FROM pharmacien ';
$chaine.= 'LEFT JOIN agrement ON pharmacien.ref_agrement = agrement.id ';
$chaine.= 'LEFT JOIN officine ON pharmacien.ref_identification = officine.ref_identification ';
$chaine.= 'WHERE';
for ($i = 0; $i < sizeof($conditions); $i++)
{
$chaine .= " ".$conditions[$i][0]." ".$conditions[$i][1]." :param".($i + 1);
if ($i < sizeof($conditions) - 1)
{
$chaine .= " AND";
}
}
$chaine .= " ORDER BY pharmacien.nom";
echo $chaine.'<br />';
$req = $conn->prepare($chaine);
// On lie les conditions à la requête
$params = array();
for ($i = 0; $i < sizeof($conditions); $i++)
{
if ($conditions[$i][1] == '=')
{
$condition = $conditions[$i][2];
$params[':param'.($i + 1)] = $condition;
}
elseif($conditions[$i][1]=='BETWEEN')
{
$condition = $conditions[$i][2];
//$req->bindParam(($i + 1), $condition, PDO::PARAM_STR);
$params[':param'.($i + 1)] = $condition;
}
else
{
$condition = $conditions[$i][2].'%';
//$req->bindParam(($i + 1), $condition, PDO::PARAM_STR);
$params[':param'.($i + 1)] = $condition;
}
}
// execution de la requête
echo str_replace(array_keys($params), array_values($params), $req->queryString);
$req->execute($params);
//echo str_replace(array_keys($params), array_values($params), $req->queryString);
//Récupération du nombre d'enregistrements retournés par la requête précédente
$reqnb = $req->fetchAll();
$nbre_resultats = count($reqnb);
// On rexecute la requête car on a déjà parcouru tous les résultats pour les compter et que l'on ne peut pas repositionner le curseur au début pour les reparcourir
$req->execute();
// Sinon, on affiche les différents résultats
$retour = '<table border="2" style="border-color:blue;border-style:solid;">';
$retour.= '<tr><td>Nom</td><td>Prénom</td><td>Gender</td><td>Date of birth</td><td>Date of death<td>DMU</td><td>Date of last visit</td></tr>';
// IMPORTANT : ne pas oublier le conditionètre PDO::FETCH_ASSOC ici, sinon PDO retourne par défaut un tableau de résultats mixte
// c-à-d qu'on peut accéder aux résultat par leur index ou par le nom du champ => résultats en double lorsque que l'on parcours tous les résultats à l'aide de foreach
while ($row = $req->fetch(PDO::FETCH_ASSOC))
{
//$retour.= '<tr><td align="center"><input type="button" value="" id="'.$row["nom"].'" /> </td>';
foreach($row as $NomCol => $Valeur)
{ //je n'affiche que les colonnes nécessaires
//1 je parts d'ici, je vais dans la fonction update_enregistrement
if($NomCol != 'ref_agrement' && $NomCol != 'id')
{
$retour.= '<td><input type="text" name="new[' . $row['id'] . '][' . $NomCol . ']" id="new[' . $row['id'] . '][' . $NomCol . ']" value="'.$Valeur.'"/></td>';
}
//echo $NomCol.''.$valeur;
}
$retour.= '</tr>';
}
$retour.='</table>';
echo $retour;
?> |
Partager