我正在使用PDO来运行查询,但我的工作方式并不正常。我在pdo周围写了一个包装器,这里是主要的查询方法:
<?php
public function query($query, $params = array())
{
if(!is_array($params))
{
throw new Exception("Parameter 2 must be a key => value array.");
}
if(!$this->pdo)
{
$this->connect();
}
echo "
--------------------------------------------------------------------------------
$query
--------------------------------------------------------------------------------
";
$this->sql = $this->pdo->prepare($query);
foreach($params as $key => $value)
{
$this->sql->bindParam($key, $value);
}
$sql = $this->sql->execute();
if(!$sql)
throw new Exception('[' . $this->sql->errorCode() . ']: ' . $this->sql->errorInfo());
}
我无法显示整个查询,但以下是其中的一部分:
$str = "SET @usapev = :usapev;
SET @canpev = :canpev;
SET @ven = :ven;
SET @usa = :isUSA;
SET @can = :isCAN;
DROP TEMPORARY TABLE IF EXISTS T_MailingList;
CREATE TEMPORARY TABLE T_MailingList
(
bsg_uk INT NOT NULL PRIMARY KEY,
demog_id INT NOT NULL,
procardnbr VARCHAR(12)
);
INSERT IGNORE INTO T_MailingList
SELECT m.bsg_uk
, m.demog_id
, m.procardnbr
FROM FROM bsg.member m;";
然后我按如下方式运行查询:
<?php
$this->db->query($str, array(
"ven" => $ven,
"usapev" => $usapev,
"canpev" => $canpev,
"isUSA" => (int)$is_usa,
"isCAN" => (int)$is_can
));
当查询在query()
中的回显中回显时,我将其复制到工作台并运行它,并且它在那里工作正常。没有错误,我得到了结果。在pdo中,当我运行另一个想要使用临时表的查询时,该表不存在。
为什么它在PDO中不起作用?
答案 0 :(得分:0)
这可能与一次只能准备一个查询有关。以下是afaik预处理语句的工作原理:首先将查询发送到mysql,然后单独发送参数。由于您向mysql发送了多个查询,这可能是导致问题的原因。
PS:我建议你想要实现的存储过程。
答案 1 :(得分:0)
使用
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
或用“;”爆炸查询并在循环中运行每个查询
$queries = explode(";", $query);
foreach ($queries as $query) {
$pdo->query($query, $attrs);
}