Pregunta

En una declaración mysqli preparado, un NULL se convirtió en '' (en el caso de una cadena) o 0 (en el caso de un número entero). Me gustaría guardarlo como un verdadero NULL. ¿Hay alguna manera de hacer esto?

¿Fue útil?

Solución

Sé que esto es un hilo viejo, pero es posible enlazar un verdadero valor NULL a las declaraciones preparadas (leer esta ).

  

Puede, de hecho, el uso mysqli_bind_parameter para pasar un valor NULL a la base de datos. basta con crear una variable y almacenar el valor NULL (vea la página de manual para ello) a la variable y se unen eso. Funciona muy bien para mí de todos modos.

Por lo tanto, tendrá que ser algo como:

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

Esto debe insertar un valor NULL en la base de datos.

Otros consejos

Para cualquiera que venga mirar esto porque están teniendo problemas NULL vinculantes en su WHERE declaración, la solución es la siguiente:

Hay un mysql NULL operador seguro que debe ser utilizado:

<=>

Ejemplo:

<?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;
}
?>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top