如何使用$wpdb->Query执行多语句SQL查询?

时间:2018-05-31 作者:username.ak

我打电话$wpdb->query() 在以下查询上

INSERT INTO wp_ctt_timetables (name, homework, tod, class, dow, lesson) VALUES (\'\', \'\', \'\', 3, 0, 0);
INSERT INTO wp_ctt_timetables (name, homework, tod, class, dow, lesson) VALUES (\'\', \'\', \'\', 3, 0, 1);
INSERT INTO wp_ctt_timetables (name, homework, tod, class, dow, lesson) VALUES (\'\', \'\', \'\', 3, 0, 2);
INSERT INTO wp_ctt_timetables (name, homework, tod, class, dow, lesson) VALUES (\'\', \'\', \'\', 3, 0, 3);
-- and so on
但它不起作用,并对错误日志说:

您的SQL语法有错误;查看与MySQL服务器版本相对应的手册,了解使用“插入wp\\U ctt\\U时间表(名称、家庭作业、tod、类、dow、课程)”值(第2行中的“INSERT INTO wp\\U ctt\\U timetables(name、Home作业、tod、class、dow、lesson))附近的正确语法

3 个回复
最合适的回答,由SO网友:XedinUnknown 整理而成

TL;DR

这在wpdb. 使用dbDelta(). 更好的是,使用其他工具来运行原始查询。

说明

wpdb->query() uses 这个mysql_query() 作用来自PHP手册:

mysql\\u query()发送唯一查询(multiple queries are not supported) 指向服务器上与指定link\\u标识符关联的当前活动数据库。

为了让它发挥作用,wpdb 必须使用mysqli_multi_query(). 但您在这里处理的是WordPress:它仍然使用不推荐的mysql 扩大

解决方案1我设想WP会有一些东西来帮助迁移,显然它确实做到了:dbDelta(). 这是一个438行长的怪物,所以我将为您节省一些时间:

它不会提供一个单独查询的列表。它返回由查询执行的更新列表-如果要使用以下第二个参数运行它们true. 在内部,它用分号分隔查询,然后执行无法判断发生了什么的magix操作。如果使用不当,此功能可能会打开门户而被遗忘。看起来它实际上跳过了某些查询,例如global tables. 它将规范化空白,引用列名。如果查询正在创建已经存在的WP表,但架构中的某些内容不同,例如索引或列类型,那么它将尝试更改这些表,而无需重新创建它们,以便它们可以匹配查询将创建的内容。I do not know why it is able to successfully run queries where the semicolon doesn\'t terminate a query, such as part of the string.

如果你认为你可以IoC 并通过wpdb 反对你的酷的标准化接口实现,那么你就不走运了。

解决方案2使用另一个DB适配器或扩展。在大多数情况下,如果需要运行迁移,例如创建表和插入许多行,如果不使用wpdb (因此必须创建另一个DB连接),因为这种情况很少发生。此外,由于dbDelta(), 找到一种运行原始查询的方法可能更可靠。

  • mysqli_multi_query() 是的函数mysqli (未过时)扩展,可轻松同时运行多个语句
  • PDO 可以在中运行多个查询emulation mode.

SO网友:Jiwan

在变量中声明表名。

$tbl_name = $wpdb->prefix.\'your_table_name\';
在数组中声明字段名。

$fields = array(
    \'your_field1\',
    \'your_field2\',
    \'your_field3\',                      
);
将表单数据存储在某些变量中。

$data1 = $_POST[\'your_field1\'];
$data2 = $_POST[\'your_field2\'];
$data3 = $_POST[\'your_field3\'];
将表单数据作为数组存储在变量中

$mydata = array( 
    \'your_field1\' => $data1,
    \'your_field2\' => $data2,
    \'your_field3\' => $data3,        
) ;
最后调用插入查询。

$wpdb->insert( $tbl_name, $mydata )
您可以在foreach循环中为多个数据行运行代码。

SO网友:Aurovrata

在您的示例中,您试图在表中插入多行,因此可以使用single statement,

$sql = "INSERT INTO wp_ctt_timetables (name, homework, tod, class, dow, lesson) VALUES (\'\', \'\', \'\', 3, 0, 0), (\'\', \'\', \'\', 3, 0, 1), (\'\', \'\', \'\', 3, 0, 2), (\'\', \'\', \'\', 3, 0, 3), (\'\', \'\', \'\', 3, 0, 4)"; //... and so on
$results = $wpdb->query($sql);
但是,要回答您的原始问题,如果每个查询都不同,您也可以逐个执行查询,

$sql = "query 1...";
$results = $wpdb->query($sql);
$sql = "query 2...";
$results = $wpdb->query($sql);
$sql = "query 3...";
$results = $wpdb->query($sql);
如果你create a temporary table and use that table in a subsequent query.

结束