Valider d257a795 rédigé par marcimat's avatar marcimat
Parcourir les fichiers

PHP 8.1 #4968 : Deprecated-- sur spip_mysql_cite() si valeur null;

Le comportement de `sql_quote(null)` est potentiellement problématique.
Il se comporte comme auparavant, c’est à dire tel que `sql_quote('')`.

Il serait plus logique de retourner le vrai terme `NULL` pour Mysql ;
c’est d’ailleurs ce qui est fait lorsqu’on indique le type de champ
tel que `sql_quote(null, 'int')`.

Par contre, si le type explicite `not null` tel que dans `sql_quote(null, 'int NOT NULL')`,
alors ça retourne "''" car l’on sait que NULL ne peut être présent dans la colonne.

Cependant, toute opération de comparaison avec `NULL` en mysql retourne `NULL`
(cf: https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html).
Donc si une personne voulait effecivement comparer avec null, il faut utiliser `IS NULL` ou `IS NOT NULL`
ce que ne sera pas fait avec `'texte = ' . sql_quote(null, 'string')`.
parent 6aa0f802
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+12 −12
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -1661,24 +1661,24 @@ function spip_mysql_cite($v, $type) {
	if (!$type) {
		if (is_bool($v)) {
			return strval(intval($v));
		}
		elseif (is_numeric($v)) {
		} elseif (is_numeric($v)) {
			return strval($v);
		} elseif ($v === null) {
			return "''";
		}
		return "'" . addslashes($v) . "'";
	}

	if (
		is_null($v)
		and stripos($type, 'NOT NULL') === false
	) {
	if ($v === null) {
		if (stripos($type, 'NOT NULL') === false) {
			// null php se traduit en NULL SQL
			return 'NULL';
		} else {
			return "''";
		}
	if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
	} elseif (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
		return $v;
	}
	if (sql_test_int($type)) {
	} elseif (sql_test_int($type)) {
		if (
			is_numeric($v) 
			or ($v and ctype_xdigit(substr($v, 2)) and $v[0] === '0' and $v[1] === 'x')