我到处寻找答案,并尝试了我在StackOverflow和其他网站上找到的所有内容。
基本上发生的事情是,无论何时执行SQL查询,PDO都会执行两次,即使execute()
只被调用一次......
这是我的代码......
<?php
namespace quizazle;
class sql{
private $username = 'x';
private $passwd = '';
private $port = 3306;
private $host = 'x';
private $name = 'x';
private $charSet = 'utf8mb4';
private $db = null;
public function __construct(){
$this->db = new \PDO("mysql:host=$this->host;dbname=$this- >name;charset=$this->charSet", $this->username, $this->passwd);
$this->db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$this->db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);
$this->db->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
}
private function bind($q, $p){
try{
$s = $this->db->prepare($q);
if(!empty($p)){
foreach ($p as $pm){
$s->bindParam($pm['key'], $pm['value']);
}
}
}
catch(PDOException $e){
echo($e->getMessage());
}
return $s;
}
public function query($query, $params){
try{
$statement = $this->bind($query, $params);
$statement->execute();
$res = $statement->fetchAll(\PDO::FETCH_BOTH);
return $res;
}
catch(PDOException $e){
echo($e->getMessage());
}
}
public function update($query, $params){
try{
$statement = $this->bind($query, $params);
$statement->execute();
$res = $statement->rowCount();
return $res;
}
catch(PDOException $e){
echo($e->getMessage());
}
}
}
?>
以下是我使用sql
类...
$sql = new quizazle\sql();
$params = array(
array(
'key' => 'd',
'value' => 'a'
)
);
$result = $sql->update("INSERT INTO `test` (`data`) VALUES(:d)", $params);
var_dump($result);
我试过......
var_dump($result);
$this->db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);
更改为$this->db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
$this->db->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
更改为$this->db->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
然而这一切都没有奏效。任何帮助将不胜感激,并提前感谢大家:))
PS:我在运行INSERT语句时发现了这个问题,如果这有帮助的话。
答案 0 :(得分:1)
要解决第一个问题,请单独使用PDO。在您的班级中只保留一种方法 - query()
,让它返回 PDOStatement :
public function query($query, $params) {
$statement = $this->db->prepare($query);
$statement->execute($params);
return $statement;
}
并利用链接方法从中获取不同类型的结果。您可以在我的文章Your first database wrapper's childhood diseases中阅读详细说明。因此,您的应用程序代码将变得更加清晰:
$sql = new quizazle\sql();
$params = array('d' => 'a');
$result = $sql->query("INSERT INTO `test` (`data`) VALUES(:d)", $params);
var_dump($result->rowCount());
而对于第二个,只是不要使您的路由器脚本充当404处理程序。根据请求参数,仅在它们打算的情况下运行任何控制器。不要为您获得的每个请求运行任何SQL,而只针对您期望的请求执行任何SQL。
答案 1 :(得分:-1)