Używam tego kodu i jestem bez frustracji:
try {
$dbh = new PDO('mysql:dbname=' . DB . ';host=' . HOST, USER, PASS);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
}
catch(PDOException $e)
{
...
}
$stmt = $dbh->prepare('INSERT INTO table(v1, v2, ...) VALUES(:v1, :v2, ...)');
$stmt->bindParam(':v1', PDO::PARAM_NULL); // --> Here's the problem
PDO::PARAM_NULL, null, '',
wszystkie z nich zawodzą i zgłaszają ten błąd:
Błąd krytyczny : nie można przekazać parametru 2 przez odwołanie w / opt / ...
bindValue()
ponadbindParam()
; za wszystko, nie tylko zaNULL
wartość. Nie przychodzi mi do głowy ani jeden przypadek, w którym musiałbyś powiązać parametr z odwołaniem do zmiennej PHP - ale tak właśniebindParam()
jest.Podczas używania
bindParam()
musisz przekazać zmienną, a nie stałą. Więc przed tą linią musisz utworzyć zmienną i ustawić ją nanull
Otrzymasz ten sam komunikat o błędzie, jeśli spróbujesz:
źródło
Podczas używania
INTEGER
kolumn (które mogą byćNULL
) w MySQL, PDO ma pewne (dla mnie) nieoczekiwane zachowanie.Jeśli używasz
$stmt->execute(Array)
, musisz określić literałNULL
i nie możesz podaćNULL
przez odwołanie do zmiennej. Więc to nie zadziała:Ale to zadziała:
Wypróbowałem to na MySQL 5.5.15 z PHP 5.4.1
źródło
isset()
lepiej koreluje zNULL
. Wartość jest również pusta.Dla tych, którzy nadal mają problemy (nie można przekazać parametru 2 przez odniesienie), zdefiniuj zmienną o wartości null, a nie tylko przekazuj null do PDO:
Mam nadzieję że to pomoże.
źródło
Miałem ten sam problem i znalazłem to rozwiązanie działające z bindParam:
źródło
Jeśli chcesz wstawić
NULL
tylko wtedy, gdyvalue
jestempty
lub''
, ale wstaw,value
gdy jest dostępny.A) Odbiera dane formularza metodą POST i wywołuje funkcję insert z tymi wartościami.
B) Ocenia, czy pole nie zostało wypełnione przez użytkownika i wstawia,
NULL
jeśli tak jest.Na przykład, jeśli użytkownik nie wprowadzi niczego w
productName
polu formularza, to$productName
będzieSET
aleEMPTY
. Musisz więc sprawdzić, czy tak jestempty()
, a jeśli tak, to włóżNULL
.Przetestowano na PHP 5.5.17
Powodzenia,
źródło
IFNULL()
funkcji MySQL w ciągu zapytania. W ten sposób:$sql = "INSERT INTO products ( productId, productName ), VALUES ( IFNULL(:productId, NULL), IFNULL(:productName, NULL) )";
Spróbuj tego.
źródło
Na podstawie innych odpowiedzi, ale z trochę większą jasnością, jak właściwie korzystać z tego rozwiązania.
Jeśli na przykład masz pusty ciąg dla wartości czasu, ale chcesz zapisać go jako wartość null:
Zauważ, że dla wartości czasu użyłbyś PARAM_STR, ponieważ czasy są przechowywane jako ciągi.
źródło
W moim przypadku używam:
SQLite,
przygotowane wyciągi z placeholderami do obsługi nieznanej liczby pól,
Żądanie AJAX wysłane przez użytkownika, w którym wszystko jest ciągiem znaków i nie ma czegoś takiego jak
NULL
wartość iDesperacko muszę wstawić
NULL
s, ponieważ nie narusza to ograniczeń klucza obcego (dopuszczalna wartość).Załóżmy, że teraz użytkownik wysyła pocztą:
$_POST[field1]
z wartością,value1
która może być pustym ciągiem znaków""
lub"null"
lub"NULL"
.Najpierw oświadczam:
gdzie
{$sColumns}
jest coś podobnegofield1, field2, ...
i{$sValues}
są moje symbole zastępcze?, ?, ...
.Następnie zbieram
$_POST
dane związane z nazwami kolumn w tablicy$values
i zamieniam naNULL
s:Teraz mogę wykonać:
i między innymi ominąć ograniczenia klucza obcego.
Z drugiej strony, jeśli pusty łańcuch ma większy sens, to musisz sprawdzić, czy to pole jest częścią klucza obcego, czy nie (bardziej skomplikowane).
źródło