Table des matières

Requêtes MySQL avec PHP

Une des fonctions intéressantes dans PHP, est sa facilité d'utilisation avec les bases de données MySQL. Beaucoup d'exemples seront donnés dans cette page.

Il faut noter que l'utilisation de requêtes SQL directement dans le code PHP n'est pas une pratique recommandée. Une utilisation de framework tel que CakePHP, ZendFramework, Symphony peut s'avérer fort utile dans ces cas-là.

Connexion

D'abord, il faut connecter à la base de données MySQL. Il faut spécifier quatre paramètres dans deux instructions.

Paramètre Signification
$host Adresse du serveur de la BD (souvent localhost)
$user Nom d'usagé qui a accès à la BD
$pass Mot de passe associé à l'usager
$db Nom de la base de donnée à sélectionner
$connection = mysql_connect($host, $user, $pass) or die ("Impossible de connecter !");
mysql_select_db($db) or die ("Impossible de sélectionner la base de donnée !");

Requête pour chercher un seul résultat

$query = "SELECT * FROM users WHERE usr_id = '$usertofind' LIMIT 1";
$result = mysql_query($query) or die ("Erreur dans la requete: $query. " . mysql_error());
$user = mysql_fetch_object($result);

Requête pour chercher plusieurs résultats

Dans cet exemple, plusieurs résultats sont retournés par la requête et ils seront traités dans une boucle while.

$query = "SELECT * FROM events WHERE evt_afficher > 0 ORDER BY evt_date_begin ASC";
$result = mysql_query($query) or die ("Erreur dans la requete: $query. " . mysql_error());
 
$nb_evt = 0;  // compte les events
 
while($evenement = mysql_fetch_object($result)) {    ?>
 
    <div class="evt_encadre">
      <div class="evt_titre"><b><? echo $evenement->evt_titre; ?></b></div>
        <div class="evt_normal"><? echo nl2br($evenement->evt_description); ?></div>
        <div class="evt_infos">Quand : Le <? echo timestampToDateHeureFr($evenement->evt_dateheure); ?></div>
      <div class="evt_infos">Site Internet : <a href="<? echo $evenement->evt_url; ?>"><? echo $evenement->evt_url; ?></a></div>
    </div>
    <?php
  $nb_evt++;
}

Pour compter le nombre de résultats

Il peut être intéressant de savoir combien de résultats une requête a retourné.

//trouve le nombre de commentaires
$query = "SELECT com_id FROM commentaires WHERE com_actif = 1";
$result = mysql_query($query) or die ("Erreur dans la requete: $query. " . mysql_error());
$nb_commentaires = mysql_num_rows($result);

Ajouter un enregistrement

$query_sta = "INSERT INTO clients(code, nom, prenom, tel, date_ajout) VALUES('$code', '$nom', '$prenom', '$tel', NOW())";
$result_sta = mysql_query($query_sta) or die ("Erreur dans la requete: $query_sta. " . mysql_error());

Modification

$query = "UPDATE films SET titre = '$titre', titreoriginal = '$titreoriginal', volume = '$volume', 
  volume2 = '$volume2', imageurl = '$imageurl', synopsis = '$synopsis', origine = '$origine',
  genre = '$genre', classification = '$classification', duree = '$duree', annee = '$annee',
  realisateur = '$realisateur', acteurs = '$acteurs', langue = '$langue', soustitres = '$soustitres', cote = '$cote',
  cotep = '$cotep', format = '$format', parties = '$parties', site = '$site', dateajout = NOW() WHERE id = '$id'";
$result = mysql_query($query) or die ("Erreur dans la requete: $query. " . mysql_error());

Blob

<?php
$db_host = 'localhost'; // don't forget to change 
$db_user = 'mysql-user'; 
$db_pwd = 'mysql-password';
 
$database = 'test';
$table = 'ae_gallery';
// use the same name as SQL table
 
$password = '123';
// simple upload restriction,
// to disallow uploading to everyone
 
 
if (!mysql_connect($db_host, $db_user, $db_pwd))
    die("Can't connect to database");
 
if (!mysql_select_db($database))
    die("Can't select database");
 
// This function makes usage of
// $_GET, $_POST, etc... variables
// completly safe in SQL queries
function sql_safe($s)
{
    if (get_magic_quotes_gpc())
        $s = stripslashes($s);
 
    return mysql_real_escape_string($s);
}
 
// If user pressed submit in one of the forms
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
    // cleaning title field
    $title = trim(sql_safe($_POST['title']));
 
    if ($title == '') // if title is not set
        $title = '(empty title)';// use (empty title) string
 
    if ($_POST['password'] != $password)  // cheking passwors
        $msg = 'Error: wrong upload password';
    else
    {
        if (isset($_FILES['photo']))
        {
            @list(, , $imtype, ) = getimagesize($_FILES['photo']['tmp_name']);
            // Get image type.
            // We use @ to omit errors
 
            if ($imtype == 3) // cheking image type
                $ext="png";   // to use it later in HTTP headers
            elseif ($imtype == 2)
                $ext="jpeg";
            elseif ($imtype == 1)
                $ext="gif";
            else
                $msg = 'Error: unknown file format';
 
            if (!isset($msg)) // If there was no error
            {
                $data = file_get_contents($_FILES['photo']['tmp_name']);
                $data = mysql_real_escape_string($data);
                // Preparing data to be used in MySQL query
 
                mysql_query("INSERT INTO {$table}
                                SET ext='$ext', title='$title',
                                    data='$data'");
 
                $msg = 'Success: image uploaded';
            }
        }
        elseif (isset($_GET['title']))      // isset(..title) needed
            $msg = 'Error: file not loaded';// to make sure we've using
                                            // upload form, not form
                                            // for deletion
 
 
        if (isset($_POST['del'])) // If used selected some photo to delete
        {                         // in 'uploaded images form';
            $id = intval($_POST['del']);
            mysql_query("DELETE FROM {$table} WHERE id=$id");
            $msg = 'Photo deleted';
        }
    }
}
elseif (isset($_GET['show']))
{
    $id = intval($_GET['show']);
 
    $result = mysql_query("SELECT ext, UNIX_TIMESTAMP(image_time), data
                             FROM {$table}
                            WHERE id=$id LIMIT 1");
 
    if (mysql_num_rows($result) == 0)
        die('no image');
 
    list($ext, $image_time, $data) = mysql_fetch_row($result);
 
    $send_304 = false;
    if (php_sapi_name() == 'apache') {
        // if our web server is apache
        // we get check HTTP
        // If-Modified-Since header
        // and do not send image
        // if there is a cached version
 
        $ar = apache_request_headers();
        if (isset($ar['If-Modified-Since']) && // If-Modified-Since should exists
            ($ar['If-Modified-Since'] != '') && // not empty
            (strtotime($ar['If-Modified-Since']) >= $image_time)) // and grater than
            $send_304 = true;                                     // image_time
    }
 
 
    if ($send_304)
    {
        // Sending 304 response to browser
        // "Browser, your cached version of image is OK
        // we're not sending anything new to you"
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', $ts).' GMT', true, 304);
 
        exit(); // bye-bye
    }
 
    // outputing Last-Modified header
    header('Last-Modified: '.gmdate('D, d M Y H:i:s', $image_time).' GMT',
            true, 200);
 
    // Set expiration time +1 year
    // We do not have any photo re-uploading
    // so, browser may cache this photo for quite a long time
    header('Expires: '.gmdate('D, d M Y H:i:s',  $image_time + 86400*365).' GMT',
            true, 200);
 
    // outputing HTTP headers
    header('Content-Length: '.strlen($data));
    header("Content-type: image/{$ext}");
 
    // outputing image
    echo $data;
    exit();
}
?>
<html><head>
<title>MySQL Blob Image Gallery Example</title>
</head>
<body>
<?php
if (isset($msg)) // this is special section for
                 // outputing message
{
?>
<p style="font-weight: bold;"><?=$msg?>
<br>
<a href="<?=$PHP_SELF?>">reload page</a>
<!-- I've added reloading link, because
     refreshing POST queries is not good idea -->
</p>
<?php
}
?>
<h1>Blob image gallery</h1>
<h2>Uploaded images:</h2>
 
<form action="<?=$PHP_SELF?>" method="post">
<!-- This form is used for image deletion -->
 
<?php
$result = mysql_query("SELECT id, image_time, title FROM {$table} ORDER BY id DESC");
if (mysql_num_rows($result) == 0) // table is empty
    echo '<ul><li>No images loaded</li></ul>';
else
{
    echo '<ul>';
    while(list($id, $image_time, $title) = mysql_fetch_row($result))
    {
        // outputing list
        echo "<li><input type='radio' name='del' value='{$id}'>";
        echo "<a href='{$PHP_SELF}?show={$id}'>{$title}</a> &ndash; ";
        echo "<small>{$image_time}</small></li>";
    }
 
    echo '</ul>';
 
    echo '<label for="password">Password:</label><br>';
    echo '<input type="password" name="password" id="password"><br><br>';
 
    echo '<input type="submit" value="Delete selected">';
}
?>
 
</form>
<h2>Upload new image:</h2>
<form action="<?=$PHP_SELF?>" method="POST" enctype="multipart/form-data">
<label for="title">Title:</label><br>
<input type="text" name="title" id="title" size="64"><br><br>
 
<label for="photo">Photo:</label><br>
<input type="file" name="photo" id="photo"><br><br>
 
<label for="password">Password:</label><br>
<input type="password" name="password" id="password"><br><br>
 
<input type="submit" value="upload">
</form>
</body>
</html>