Использование нулей в подготовленном операторе mysqli

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

Не могу поверить, как долго я боролся с этим, и ответ был почти очевиден. Строго: нельзя. Конструктивно: bind_param. По коду: $query_param_01 = (null===$param_01) ? "?" : "NULL"; +1 всем. (Я буду придерживаться {$query_param_01}, так как проблем с инъекциями по-прежнему нет. Не стесняйтесь исправлять.

Bradmage 08.02.2016 09:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
22
1
27 893
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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


Please see @creatio's answer: 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;
} 

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

FWIW, это прерывается на "WHERE column_name! =?" потому что сравнения с NULL всегда равны NULL. Это также нарушает "WHERE question = 'et tu, brute?'"

Bill Karwin 16.12.2008 20:55

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

Ответ принят как подходящий

К подготовленным операторам можно привязать истинное значение NULL (прочтите это).

You can, in fact, use mysqli_bind_parameter to pass a NULL value to the database. simply create a variable and store the NULL value (see the manpage for it) to the variable and bind that. Works great for me anyway.

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

<?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.

Хорошо, именно то, что мне нужно было знать, просто сделал его немного более общим: foreach($param as $k => $v) { if ($v == '') $param[$k] = NULL; }, так что в основном любая пустая запись преобразуется в истинный NULL, но осторожно с вложенными массивами, просто сделайте это рекурсивным, если ur использует их ^^ Это должно быть выбранный ответ, спасибо

Fernando Silva 08.05.2014 19:03

Для тех, кто смотрит на это, потому что у них проблемы с привязкой 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);
?>
<?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;
}
?>

Другие вопросы по теме