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);
?>