26

mysqli のプリペアド ステートメントでは、NULL は '' (文字列の場合) または 0 (整数の場合) に変換されます。真のNULLとして保存したいと思います。これを行う方法はありますか?

4

5 に答える 5

43

準備されたステートメントに真のNULL値をバインドすることが可能です(これを読んでください)。

実際、mysqli_bind_parameterを使用して、データベースにNULL値を渡すことができます。変数を作成し、NULL値(そのマンページを参照)を変数に格納してバインドするだけです。とにかく私にとっては素晴らしい作品です。

したがって、次のようにする必要があります。

<?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値が挿入されます。

于 2011-07-31T21:39:26.993 に答える
40

WHEREステートメントでNULLをバインドするのに問題があるためにこれを見に来る人にとって、解決策は次のとおりです。

使用する必要のあるmysqlNULLセーフ演算子があります。

<=>

例:

<?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);
?>
于 2012-04-26T20:15:40.640 に答える
3

上の PHP ドキュメントmysqli_stmt::bind_paramへのコメントは、引き渡しNULLが容易ではなかったことを示しています。


@creatio の回答をご覧ください: https://stackoverflow.com/a/6892491/18771


コメントで提供されているソリューションは、準備されたステートメントに対していくつかの事前準備作業を行い、PHP値を持つすべてのパラメーターに対して"?"マーカーを置き換えます。次に、変更されたクエリ文字列が使用されます。"NULL"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;
} 

(これは実際に私が行ったコーディング スタイルではありませんが、機能する場合は...)

于 2008-12-16T16:12:44.857 に答える
-2

bind_paramすべてのパラメーターを配列に格納し、.を使用して関数に渡しますarray_shift($myArray)。NULL はそのように受け入れられます。

于 2009-08-05T18:57:52.793 に答える
-3
<?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;
}
?>
于 2014-12-31T21:27:49.127 に答える