سؤال

في عبارة mysqli المعدة، يتم تحويل NULL إلى '' (في حالة السلسلة) أو 0 (في حالة العدد الصحيح).أرغب في تخزينه باعتباره NULL حقيقي.هل هناك أي طريقة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

وأنا أعلم أن هذا هو موضوع قديم، ولكن كان من الممكن ربط قيمة NULL الحقيقية للبيانات معدة (اقرأ <لأ href = "http://www.php.net/manual/en/mysqli-stmt.bind -param.php # 96148 "> هذا ).

<اقتباس فقرة>   

ويمكنك، في الواقع، واستخدام mysqli_bind_parameter لتمرير قيمة NULL إلى قاعدة البيانات. ببساطة إنشاء متغير وتخزين قيمة NULL (انظر manpage لذلك) إلى المتغير وربط ذلك. يعمل كبيرة بالنسبة لي على أية حال.

وهكذا سيكون لديك ليكون شيئا مثل:

<?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 في قاعدة البيانات.

نصائح أخرى

لأي شخص يأتي وينظر إلى هذا لأنه يواجه مشاكل في ربط NULL في ملف WHERE بيان، الحل هو هذا:

هناك الخلية مشغل آمن فارغ التي يجب استخدامها:

<=>

مثال:

<?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_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;
} 

(إنه ليس أسلوب الترميز الذي كنت سأفعله به حقًا، ولكن إذا كان يعمل ...)

وبجانبي، أنا تخزين كل المعلمات في مجموعة وتمريرها في وظيفة Bind_param التي كتبها array_shift ($ myArray). قبلت NULL من هذا القبيل .. 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;
}
?>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top