PHP - PDO查询执行两次execute()只调用一次

时间:2016-09-16 21:48:40

标签: php mysql pdo

我到处寻找答案,并尝试了我在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语句时发现了这个问题,如果这有帮助的话。

2 个答案:

答案 0 :(得分:1)

  1. 您编写的非常奇怪的类使您的数据库的体验比使用vanilla PDO更糟糕
  2. 最有可能您实施SEO友好的URL并不是更好。
  3. 要解决第一个问题,请单独使用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)

我很遗憾浪费你所有的时间,这是我的愚蠢错误。

你知道,我使用的是Blisk,它是专为开发人员设计的浏览器。由于它是专为开发人员设计的,因此它具有内置功能,允许您像在移动设备上一样查看您的网站,例如... enter image description here

在此浏览器中加载页面时,会加载两次,一次用于PC视图,一次用于移动视图。这意味着任何PHP函数都会被调用两次,因为页面实际上被加载了两次,这是我问题的根源。

代码或服务器没有任何问题,只是我使用Blisk就是问题所在。现在我回到了Chrome上,一切都还好!

我已经向Blisk开发人员标记了问题,所以希望能够做些什么来解决这个问题! :)