Bir mysqli hazırlanan açıklamada boş değerlere kullanarak

3 Cevap php

Bir mysqli hazırlanan açıklamada, bir NULL (bir dize durumunda)'' dönüştü alır veya 0 (bir tamsayı durumunda). Ben gerçek bir NULL olarak saklamak istiyorum. Bunu yapmanın bir yolu var mı?

3 Cevap

Için yorumlar PHP documentation on mysqli_stmt::bind_param indicate that passing in NULL kolayca mümkün değildi.

Yorumların sunulan çözümler PHP null değeri olan her param için "NULL" ile "?" işaretlerin değiştirilmesi, hazırlanmış deyimi bazı ön hazırlık çalışmaları yapmak. Modifiye sorgu dizesi sonra kullanılır.

Aşağıdaki fonksiyon dan 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...)

Bu eski bir konu olduğunu biliyorum, ama bu hazırlanan tablolarda (this okumak) için gerçek bir NULL değeri bağlamak mümkündür.

Sen, aslında, veritabanına bir NULL değer geçmek için mysqli_bind_parameter kullanabilirsiniz. basit bir değişken oluşturmak ve değişkene (bunun için man sayfasına bakınız) NULL değerini depolamak ve bağlamak. Yine de benim için harika çalışıyor.

Böylece gibi bir şey olması gerekir:

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

Bu veritabanına bir NULL değeri eklemeniz gerekir.

Onların WHERE tablosunda NULL bağlayıcı sorunlar yaşıyorsanız, çünkü bu bakıyor geliyor herkes için çözüm şudur:

: A MySQL NULL safe operator kullanılmalıdır yoktur

<=>

Örnek:

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