MySQLi - Gestion des valeurs NULL
Nous avons vu SQL SELECT commande avec WHERE clause pour récupérer les données de la table MySQLi, mais lorsque nous essayons de donner une condition, qui compare la valeur du champ ou de la colonne à NULL, cela ne fonctionne pas correctement.
Pour gérer une telle situation, MySQLi fournit trois opérateurs
IS NULL - l'opérateur renvoie true si la valeur de la colonne est NULL.
IS NOT NULL - l'opérateur renvoie true si la valeur de la colonne n'est pas NULL.
<=> - l'opérateur compare les valeurs, ce qui (contrairement à l'opérateur =) est vrai même pour deux valeurs NULL.
Les conditions impliquant NULL sont spéciales. Vous ne pouvez pas utiliser = NULL ou! = NULL pour rechercher des valeurs NULL dans les colonnes. De telles comparaisons échouent toujours car il est impossible de dire si elles sont vraies ou non. Même NULL = NULL échoue.
Pour rechercher des colonnes qui sont ou non NULL, utilisez IS NULL ou IS NOT NULL.
Utilisation de valeurs NULL à l'invite de commandes
Supposons une table tutorials_bks dans la base de données TUTORIELS et contient deux colonnes id et name, où un nom NULL indique que la valeur est inconnue -
Exemple
Essayez les exemples suivants -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)
+----+---------+
| id | book |
+----+---------+
| 1 | java |
| 2 | java |
| 3 | html |
| 4 | c++ |
| 5 | Android |
| 6 | |
| 7 | |
| 8 | |
| 9 | NULL |
| 10 | NULL |
| 11 | NULL |
+----+---------+
11 rows in set (0.00 sec)
mysql>
Pour trouver des enregistrements où la colonne de nom est ou non NULL, les requêtes doivent être écrites comme ceci -
mysql> SELECT * FROM tutorials_bks WHERE book = "null";
+----+------+
| id | book |
+----+------+
| 9 | NULL |
| 10 | NULL |
| 11 | NULL |
+----+------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM tutorials_bks WHERE book ! = "null";
+----+---------+
| id | book |
+----+---------+
| 1 | java |
| 2 | java |
| 3 | html |
| 4 | c++ |
| 5 | Android |
| 6 | |
| 7 | |
| 8 | |
+----+---------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM tutorials_bks WHERE book = "";
+----+------+
| id | book |
+----+------+
| 6 | |
| 7 | |
| 8 | |
+----+------+
3 rows in set (0.01 sec)
Gestion des valeurs NULL dans un script PHP
Vous pouvez utiliser la condition if ... else pour préparer une requête basée sur une valeur NULL.
Exemple
L'exemple suivant prend tutorial_count de l'extérieur, puis le compare à la valeur disponible dans la table.
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
if( isset($tutorial_count )) {
$sql = 'SELECT tutorial_author, tutorial_count FROM tcount_tbl
WHERE tutorial_count = $tutorial_count';
} else {
$sql = 'SELECT tutorial_author, tutorial_count
FROM tcount_tbl WHERE tutorial_count IS $tutorial_count';
}
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo "Author:{$row['tutorial_author']} <br> ".
"Count: {$row['tutorial_count']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>