Frage

In einer Mysqli vorbereitete Anweisung, wird eine NULL verwandelte sich in ‚‘ (im Fall einer Zeichenkette) oder 0 (im Falle einer ganzen Zahl). Ich möchte es als eine echte NULL speichern. Gibt es eine Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Ich weiß, das ist ein alter Thread, aber es ist möglich, einen echten NULL Wert auf die vorbereiteten Anweisungen (lesen diese ).

  

Sie können in der Tat Verwendung mysqli_bind_parameter auf einen NULL-Wert in die Datenbank übergeben. erzeugen einfach eine Variable, und speichern die NULL-Wert (siehe Manpage es) der Variablen und binden, die. Funktioniert gut für mich sowieso.

So wird es etwas sein wie:

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

Dies sollte einen NULL-Wert in die Datenbank einfügen.

Andere Tipps

Für alle kommen auf diese Suche, weil sie Probleme Bindung NULL in ihrer WHERE Anweisung haben, die Lösung ist folgende:

Es gibt einen mysql NULL sicher Operator das muss verwendet werden:

<=>

Beispiel:

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

Die Kommentare zu der PHP-Dokumentation auf mysqli_stmt::bind_param zeigt, dass in NULL vorbei war nicht ohne weiteres möglich.


  

Bitte beachten Sie @ creatio Antwort: https://stackoverflow.com/a/6892491/18771


Lösungen in den Kommentaren angeboten haben einige Pre-Vorbereitungsarbeiten auf der vorbereiteten Erklärung, die "?" Marker mit "NULL" für jeden param ersetzt, der die PHP null Wert hat. Der modifizierte Abfrage-String wird dann verwendet.

Die folgende Funktion ist von Benutzer Kommentar 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;
} 

(Es ist nicht wirklich die Codierung Stil, den ich habe es getan in, aber wenn es funktioniert ...)

an meiner Seite, speichern i alle Parameter in einem Array und übergeben sie in bind_param Funktion von array_shift ($ arr). NULL wird so akzeptiert .. 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;
}
?>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top