использование нулей в подготовленном MySQL - PullRequest
19 голосов
/ 16 декабря 2008

В подготовленном MySQL операторе NULL превращается в '' (в случае строки) или 0 (в случае целого числа). Я хотел бы сохранить его как истинный NULL. Есть ли способ сделать это?

Ответы [ 5 ]

35 голосов
/ 01 августа 2011

Я знаю, что это старый поток, но можно связать истинное значение NULL с подготовленными операторами (прочитайте this ).

Фактически, вы можете использовать mysqli_bind_parameter для передачи значения NULL в базу данных. просто создайте переменную и сохраните значение NULL (см. man-страницу для нее) в переменной и привяжите ее. В любом случае, отлично работает для меня.

Таким образом, это должно быть что-то вроде:

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

Это должно вставить значение NULL в базу данных.

30 голосов
/ 27 апреля 2012

Для тех, кто смотрит на это, потому что у них есть проблемы с привязкой NULL в их выражении WHERE, решение таково:

Существует mysql NULL безопасный оператор , который необходимо использовать:

<=>

Пример:

<?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);
?>
5 голосов
/ 16 декабря 2008

Комментарии к документации PHP на mysqli_stmt::bind_param указывают на то, что передача NULL не была легко возможна.


Пожалуйста, смотрите ответ @ creatio: https://stackoverflow.com/a/6892491/18771


Решения, предлагаемые в комментариях, выполняют предварительную подготовку подготовленного оператора, заменяя маркеры "?" на "NULL" для каждого параметра, имеющего значение PHP null. Затем используется измененная строка запроса.

Следующая функция взята из комментария пользователя 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;
} 

(Это не совсем тот стиль кодирования, в котором я бы это сделал, но если бы он работал ...)

0 голосов
/ 01 января 2015
<?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;
}
?>
0 голосов
/ 05 августа 2009

со своей стороны я храню все параметры в массиве и передаю их в функцию Bind_param с помощью array_shift ($ myArray). NULL так принято .. S.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...