Saya menggunakan kode ini dan saya sangat frustrasi:
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, '',
semuanya gagal dan melempar kesalahan ini:
Kesalahan fatal : Tidak dapat melewatkan parameter 2 dengan referensi di / opt / ...
bindValue()
lebihbindParam()
; untuk segalanya, bukan hanya untukNULL
nilainya. Saya tidak dapat memikirkan satu kasus di mana Anda perlu mengikat parameter ke referensi variabel PHP - tetapi itulah yangbindParam()
dilakukannya.Saat menggunakan
bindParam()
Anda harus mengirimkan variabel, bukan konstanta. Jadi sebelum baris itu Anda perlu membuat variabel dan mengaturnya kenull
Anda akan mendapatkan pesan kesalahan yang sama jika Anda mencoba:
sumber
Saat menggunakan
INTEGER
kolom (bisa jadiNULL
) di MySQL, PDO memiliki beberapa perilaku yang tidak terduga (bagi saya).Jika Anda menggunakan
$stmt->execute(Array)
, Anda harus menentukan literalNULL
dan tidak dapat memberikanNULL
referensi variabel. Jadi ini tidak akan berhasil:Tapi ini akan berhasil:
Mencoba ini di MySQL 5.5.15 dengan PHP 5.4.1
sumber
isset()
berkorelasi lebih baik denganNULL
. String kosong juga merupakan nilai.Bagi mereka yang masih memiliki masalah (Tidak dapat melewatkan parameter 2 dengan referensi), tentukan variabel dengan nilai null, bukan hanya meneruskan null ke PDO:
Semoga ini membantu.
sumber
Saya memiliki masalah yang sama dan saya menemukan solusi ini berfungsi dengan bindParam:
sumber
Jika Anda ingin menyisipkan
NULL
hanya jikavalue
adalahempty
atau''
, tetapi sisipkanvalue
jika tersedia.A) Menerima data formulir menggunakan metode POST, dan fungsi panggilan dimasukkan dengan nilai-nilai tersebut.
B) Mengevaluasi jika bidang tidak diisi oleh pengguna, dan menyisipkan
NULL
jika demikian.Misalnya, jika pengguna tidak memasukkan apa pun di
productName
bidang formulir, maka$productName
akanSET
tetapiEMPTY
. Jadi, Anda perlu memeriksa apakah benarempty()
, dan jika ya, maka masukkanNULL
.Diuji pada PHP 5.5.17
Semoga berhasil,
sumber
IFNULL()
fungsi MySQL dalam string kueri. Seperti ini:$sql = "INSERT INTO products ( productId, productName ), VALUES ( IFNULL(:productId, NULL), IFNULL(:productName, NULL) )";
Coba ini.
sumber
Berdasarkan jawaban lain tetapi dengan sedikit kejelasan tentang bagaimana sebenarnya menggunakan solusi ini.
Jika misalnya Anda memiliki string kosong untuk nilai waktu tetapi Anda ingin menyimpannya sebagai null:
Perhatikan bahwa untuk nilai waktu Anda akan menggunakan PARAM_STR, karena waktu disimpan sebagai string.
sumber
Dalam kasus saya, saya menggunakan:
SQLite,
pernyataan yang disiapkan dengan placeholder untuk menangani jumlah bidang yang tidak diketahui,
Permintaan AJAX dikirim oleh pengguna di mana semuanya adalah string dan tidak ada yang namanya
NULL
nilai danSaya sangat perlu memasukkan
NULL
s karena itu tidak melanggar batasan kunci asing (nilai yang dapat diterima).Misalkan, sekarang pengguna mengirim dengan post:
$_POST[field1]
dengan nilaivalue1
yang bisa berupa string kosong""
atau"null"
atau"NULL"
.Pertama saya membuat pernyataan:
dimana
{$sColumns}
sth sepertifield1, field2, ...
dan{$sValues}
placeholder saya?, ?, ...
.Kemudian, saya mengumpulkan
$_POST
data saya yang terkait dengan nama kolom dalam array$values
dan mengganti denganNULL
s:Sekarang, saya bisa mengeksekusi:
dan di antara batasan kunci asing lainnya.
Jika di sisi lain, string kosong lebih masuk akal maka Anda harus memeriksa apakah bidang itu adalah bagian dari kunci asing atau bukan (lebih rumit).
sumber