Tôi đã cố chỉnh sửa một trong các giải pháp khác được liệt kê ở đây, vì nó dẫn đến mảng định dạng không được căn chỉnh với mảng dữ liệu, nhưng không thành công.
Dưới đây là một giải pháp có thể sửa đổi wpdb từ phiên bản mới nhất của wordpress, để cho phép chèn và cập nhật các giá trị null vào các bảng SQL sử dụng chèn() và cập nhật():
/*
* Fix wpdb to allow inserting/updating of null values into tables
*/
class wpdbfixed extends wpdb
{
function insert($table, $data, $format = null) {
$type = 'INSERT';
if (! in_array(strtoupper($type), array('REPLACE', 'INSERT')))
return false;
$this->insert_id = 0;
$formats = $format = (array) $format;
$fields = array_keys($data);
$formatted_fields = array();
foreach ($fields as $field) {
if (!empty($format))
$form = ($form = array_shift($formats)) ? $form : $format[0];
elseif (isset($this->field_types[$field]))
$form = $this->field_types[$field];
else
$form = '%s';
//***Steve Lee edit begin here***
if ($data[$field]===null) {
unset($data[$field]); //Remove this element from array, so we don't try to insert its value into the %s/%d/%f parts during prepare(). Without this, array would become shifted.
$formatted_fields[] = 'NULL';
} else {
$formatted_fields[] = $form; //Original line of code
}
//***Steve Lee edit ends here***
}
$sql = "{$type} INTO `$table` (`" . implode('`,`', $fields) . "`) VALUES (" . implode(",", $formatted_fields) . ")";
return $this->query($this->prepare($sql, $data));
}
function update($table, $data, $where, $format = null, $where_format = null)
{
if (! is_array($data) || ! is_array($where))
return false;
$formats = $format = (array) $format;
$bits = $wheres = array();
foreach ((array) array_keys($data) as $field) {
if (!empty($format))
$form = ($form = array_shift($formats)) ? $form : $format[0];
elseif (isset($this->field_types[$field]))
$form = $this->field_types[$field];
else
$form = '%s';
//***Steve Lee edit begin here***
if ($data[$field]===null)
{
unset($data[$field]); //Remove this element from array, so we don't try to insert its value into the %s/%d/%f parts during prepare(). Without this, array would become shifted.
$bits[] = "`$field` = NULL";
} else {
$bits[] = "`$field` = {$form}"; //Original line of code
}
//***Steve Lee edit ends here***
}
$where_formats = $where_format = (array) $where_format;
foreach ((array) array_keys($where) as $field) {
if (!empty($where_format))
$form = ($form = array_shift($where_formats)) ? $form : $where_format[0];
elseif (isset($this->field_types[$field]))
$form = $this->field_types[$field];
else
$form = '%s';
$wheres[] = "`$field` = {$form}";
}
$sql = "UPDATE `$table` SET " . implode(', ', $bits) . ' WHERE ' . implode(' AND ', $wheres);
return $this->query($this->prepare($sql, array_merge(array_values($data), array_values($where))));
}
}
global $wpdb_allow_null;
$wpdb_allow_null = new wpdbfixed(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
Chèn mã này vào một nơi nào đó luôn chạy, như functions.php của bạn, và sau đó sử dụng toàn cầu $ wpdb_allowed_null-> insert() và -> update() như bình thường.
Tôi ưa thích phương pháp này so với giá trị mặc định $ wpdb, để duy trì hành vi DB mà phần còn lại của Wordpress và các plugin khác sẽ trông đợi.
Tôi tạo ra các bảng như là một phần của một phong tục plugin - các cột được đề cập chấp nhận giá trị NULL. – leepowers
@ pygorex1 - Làm thế nào? –
Điều này là khá nhiều giải pháp duy nhất ngoài việc thay đổi ngữ nghĩa NULL/rỗng của plugin của tôi. – leepowers