Pergunta

Em uma declaração preparada mysqli, uma NULL se transformou em '' (no caso de uma string) ou 0 (no caso de um inteiro). Gostaria de armazená-lo como um verdadeiro NULL. Existe alguma maneira de fazer isso?

Foi útil?

Solução

Eu sei que esta é uma discussão antiga, mas é possível vincular um valor verdadeiro NULL às declarações preparadas (leia este ).

Você pode, na verdade, o uso mysqli_bind_parameter passar um valor NULL ao banco de dados. basta criar uma variável e armazenar o valor NULL (veja a página de manual para ele) para a variável e ligam isso. Funciona muito bem para mim de qualquer maneira.

Assim, vai ter 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);
?>

Isso deve inserir um valor NULL no banco de dados.

Outras dicas

Para qualquer um que vem olhando para isso porque eles estão tendo problemas NULL obrigatório em sua declaração WHERE, a solução é esta:

Há um mysql NULL operador seguro que deve ser utilizado:

<=>

Exemplo:

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

Os comentários para o PHP sobre mysqli_stmt::bind_param indicam que passando em NULL não era facilmente possível.


Por favor, ver @ resposta de creatio: https://stackoverflow.com/a/6892491/18771


As soluções oferecidas nos comentários fazer algum trabalho de pré-preparação no comando preparado, substituindo os marcadores "?" com "NULL" para cada parâmetro que tem o valor PHP null. A seqüência de consulta modificado é então utilizado.

A função a seguir é de comentário do usuário 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;
} 

(Não é realmente o estilo de codificação que eu teria feito isso, mas se ele funciona ...)

ao meu lado, eu armazenar todos os parâmetros em uma matriz e passá-las em função Bind_param por array_shift ($ myArray). NULL é aceito assim .. 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top