MySQLi - Gestione dei valori NULL
Abbiamo visto SQL SELECT comando insieme a WHERE clausola per recuperare i dati dalla tabella MySQLi, ma quando proviamo a dare una condizione, che confronta il valore del campo o della colonna con NULL, non funziona correttamente.
Per gestire tale situazione MySQLi fornisce tre operatori
IS NULL - L'operatore restituisce true se il valore della colonna è NULL.
IS NOT NULL - L'operatore restituisce true se il valore della colonna non è NULL.
<=> - l'operatore confronta i valori, che (a differenza dell'operatore =) è vero anche per due valori NULL.
Le condizioni che coinvolgono NULL sono speciali. Non è possibile utilizzare = NULL o! = NULL per cercare valori NULL nelle colonne. Tali confronti falliscono sempre perché è impossibile dire se siano veri o meno. Anche NULL = NULL fallisce.
Per cercare colonne che sono o non sono NULL, utilizzare IS NULL o IS NOT NULL.
Utilizzo di valori NULL al prompt dei comandi
Supponi un tavolo tutorials_bks nel database TUTORIAL e contiene due colonne id e name, dove un nome NULL indica che il valore è sconosciuto -
Esempio
Prova i seguenti esempi:
[email protected]# 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>
Per trovare record in cui la colonna del nome è o non è NULL, le query dovrebbero essere scritte in questo modo:
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)
Gestione dei valori NULL nello script PHP
È possibile utilizzare la condizione if ... else per preparare una query basata sul valore NULL.
Esempio
L'esempio seguente prende tutorial_count dall'esterno e quindi lo confronta con il valore disponibile nella tabella.
<?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);
?>