php中使用pdo使用prepare预处理语句能同时提供多条吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php中使用pdo使用prepare预处理语句能同时提供多条吗相关的知识,希望对你有一定的参考价值。

在多表插入时,必须要获取关联表的字段,下个表才能插入,这种情况下,能否一次上传多个prepare的预处理方法,然后分表插入。试了下,好像不行。
当然用数组的方式先存储先插入表的id然后再指插入到关联的表中,这样虽然可以做到,但数据不规则时,难免会出现错误。
感觉这PDO的处理数据库,虽然有些方便,但也有很多不尽人意的地方。
原来不是不可以,只是绑定的参数出了错误,问题已经解决,可惜没有人来回答。

参考技术A

你需要的是Transaction吧 

START TRANSACTION
SELECT ******
UPDATE ******
UPDATE ******
COMMIT

追问

你说的是事务处理吗? 你错了。事务归事务,预处理是预处理,二马事。别搞混了呀。

PHP PDO - 关闭语句 - 不能创建超过 max_prepared_stmt_count 语句

【中文标题】PHP PDO - 关闭语句 - 不能创建超过 max_prepared_stmt_count 语句【英文标题】:PHP PDO - Close statement - Can't create more than max_prepared_stmt_count statements 【发布时间】:2017-01-09 05:20:51 【问题描述】:

如何使用 PDO 关闭语句?如果我检查一般的 MySQL 日志,我永远不会遇到关闭命令。 (command_type: 关闭 stmt)。

截至目前,MySQL 在其中一些查询之后抛出“Can't create more than max_prepared_stmt_count statements”。

一个奇怪的事情是 PDO 准备查询,即使没有任何准备。为什么不直接执行查询(command_type: Execute)?

片段

// Executes a SQL query and returns the PDO statement
$statement = $pdo->query(sprintf('CALL TEST_PROCEDURE(%s)', implode(',', $parameters)));

// Retrieve the result of the query
$result = current($statement->fetchAll(PDO::FETCH_OBJ));

$statement = null;

一般日志

select * from mysql.general_log where argument like "%call%" \G;
...
  event_time: 2016-09-01 10:34:40
   user_host: root[root] @ localhost [127.0.0.1]
   thread_id: 4111
   server_id: 0
command_type: Prepare
    argument: CALL TEST_PROCEDURE(234,'989',1,'3353' ....)
*************************** 2. row ***************************
command_type: Execute
    argument: CALL TEST_PROCEDURE(234,'989',1,'3353' ....)

【问题讨论】:

当没有使用 prepare() 方法时,PDO 不准备任何东西。我会说这是与 mysql 日志有关的东西 一些想法:确实,PDO 'query()' 函数用于返回结果的事物,即SELECTs。对于其他一切应使用exec() (executes an SQL statement in a single function call)。因此,当query() 函数用于“调用”时,必须将其转换为“exec()”语句。 PDO 或数据库引擎。为什么要获得准备好的陈述将需要更多搜索。 @RyanVincent MySQL 过程正在返回,因此是查询方法而不是执行。 @user634545 顺便问一下,你能试试用 exec() 代替 query() 吗?以防万一。 现在我很困惑。我认为 mysql 程序不能返回一个值,因为这就是函数的用途? Out parameters 可用于从过程中返回值。这是 PDO 的另一个独立问题... 【参考方案1】:

您可以通过调用$statement->closeCursor(); 显式关闭连接

【讨论】:

我也尝试过 closeCursor,没有任何区别。 $statement = null; 正在做同样的事情。您试图提高声誉的这个问题并不像您想象的那么愚蠢。 @YourCommonSense 哇,我开始想念您宝贵的 cmets。 :)

以上是关于php中使用pdo使用prepare预处理语句能同时提供多条吗的主要内容,如果未能解决你的问题,请参考以下文章

跟着百度学PHP[14]-PDO的预处理语句2

PHP PDO - 关闭语句 - 不能创建超过 max_prepared_stmt_count 语句

PDO Prepared在单个查询中插入多行

pdo预处理语句

MySQL Prepared PDO 语句正在删除反斜杠

如何在 php 中使用 prepare 语句获取 insert_id? [复制]