Question

Dans une déclaration préparée mysqli, un NULL se transforme en « » (dans le cas d'une chaîne) ou 0 (dans le cas d'un entier). Je voudrais enregistrer comme un vrai NULL. Est-il possible de le faire?

Était-ce utile?

La solution

Je sais que c'est un vieux fil, mais il est possible de lier une vraie valeur NULL aux instructions préparées (lire cette ).

  

Vous pouvez, en fait, l'utilisation mysqli_bind_parameter pour transmettre une valeur NULL à la base de données. il suffit de créer une variable et stocker la valeur NULL (voir la page de manuel pour cela) à la variable et de lier cela. Fonctionne très bien pour moi en tout cas.

Ainsi, il va falloir être quelque chose comme:

<?php
    $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');

    // person is some object you have defined earlier
    $name = $person->name();
    $age = $person->age();
    $nickname = ($person->nickname() != '') ? $person->nickname() : NULL;

    // prepare the statement
    $stmt = $mysqli->prepare("INSERT INTO Name, Age, Nickname VALUES (?, ?, ?)");

    $stmt->bind_param('sis', $name, $age, $nickname);
?>

Cela devrait insérer une valeur NULL dans la base de données.

Autres conseils

Pour ceux qui viennent regarder parce qu'ils ont des problèmes de liaison NULL dans leur déclaration WHERE, la solution est la suivante:

Il y a un mysql NULL opérateur en toute sécurité qui doit être utilisé:

<=>

Exemple:

<?php
$price = NULL; // NOTE: no quotes - using php NULL
$stmt = $mysqli->prepare("SELECT id FROM product WHERE price <=> ?"); // Will select products where the price is null
$stmt->bind_param($price);
?>

The comments to the PHP documentation on mysqli_stmt::bind_param indicate that passing in NULL was not easily possible.


Please see @creatio's answer: https://stackoverflow.com/a/6892491/18771


Solutions offered in the comments do some pre-preparation work on the prepared statement, replacing the "?" markers with "NULL" for every param that has the PHP null value. The modified query string is then used.

The following function is from user comment 80119:

function preparse_prepared($sQuery, &$saParams)
{
    $nPos = 0;

    $sRetval = $sQuery;
    foreach ($saParams as $x_Key => $Param)
    {
        //if we find no more ?'s we're done then
        if (($nPos = strpos($sQuery, '?', $nPos + 1)) === false)
        {
            break;
        }

        //this test must be done second, because we need to 
        //increment offsets of $nPos for each ?.
        //we have no need to parse anything that isn't NULL.
        if (!is_null($Param))
        {
            continue;
        }


        //null value, replace this ? with NULL.
        $sRetval = substr_replace($sRetval, 'NULL', $nPos, 1);

        //unset this element now
        unset($saParams[$x_Key]);
    }
    return $sRetval;
} 

(It's not really the coding style I would have done it in, but if it works...)

by my side, i store every parameters in an array and pass them in Bind_param function by array_shift($myArray). NULL is accepted like that.. S.

<?php
$mysqli=new mysqli('localhost','root','','test');
$mysqli->query("CREATE TABLE test_NULL (id int(11))");
if($query=$mysqli->prepare("insert into test_NULL VALUES(?)")){
    $query->bind_param('i',$null); //note that $null is undefined
    $query->execute();
}else{
    echo __LINE__.' '.$mysqli->error;
}
?>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top