php pdo准备查询,但不执行它

php pdo准备查询,但不执行它,php,mysql,pdo,Php,Mysql,Pdo,我对php和PDO真的很陌生。我的一个朋友基本上创建了一个pdo类和几个如何使用它的示例,这对我来说非常有用。但是现在我想做一个查询,使用BETWEENmysql关键字并返回任何与条件匹配的内容,但结果为空。我已经创建了mysql\u query.log文件,从中我可以收集到的信息是查询准备好了,但没有执行。稍后我将向您展示我在日志中的发现,让我快速向您展示我的代码: $newSlot = array( "fromDate" => $db->mysql_escape_mimi

我对php和PDO真的很陌生。我的一个朋友基本上创建了一个pdo类和几个如何使用它的示例,这对我来说非常有用。但是现在我想做一个查询,使用
BETWEEN
mysql关键字并返回任何与条件匹配的内容,但结果为空。我已经创建了
mysql\u query.log
文件,从中我可以收集到的信息是查询准备好了,但没有执行。稍后我将向您展示我在日志中的发现,让我快速向您展示我的代码:

$newSlot = array(
    "fromDate" => $db->mysql_escape_mimic($startDate->format('Y-m-d H:i:s')),
    "untilDate" => $db->mysql_escape_mimic($endDate->format('Y-m-d H:i:s'))
  );

  $query = "SELECT * FROM schedule_slot WHERE (startDate BETWEEN :fromDate AND :untilDate) OR (endDate BETWEEN :fromDate AND :untilDate);";
  $result = $db->prepare($query);
  $slot = null;
  if($result == 1) {
    $result = $db->execute($newSlot);
    if($result == 1) {
      $slot = $db->fetch();
    }
  }
  print "slot: " . $slot["startDate"];
以下是日志的适用部分(我整理了一下):

下面是一个查询日志中的一个例子,它实际上对我来说很好:

161010 21:01:07     
    3 Connect   root@localhost as anonymous on test         
    3 Prepare   INSERT INTO schedule_slot(startDate, endDate) VALUES(?,?)
161010 21:01:08     
    3 Execute   INSERT INTO schedule_slot(startDate, endDate) VALUES('2016-10-11 13:35:00','2016-10-11 14:35:00')         
    3 Close stmt                
    3 Quit  
如果您想让我编辑pdo代码或其他内容,请告诉我,但据我所知,这是一个标准的pdo类。请让我知道为什么我的查询没有返回任何内容

编辑:这是pdo类的文件名
dbpdo.php

<?php

class dbpdo {

private $_connection;
private $_statement;

public function __construct( ) {}

public function connect( $host, $username, $password, $database ) {
    $connect = 'mysql:host='.$host.';dbname='.$database.';charset=utf8mb4';
    $this->_connection = new PDO($connect, $username, $password);
    $this->_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $this->_connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}

public function __destruct() {
    if ($this->_connection)
        $this->_connection = null;
}

public function query($query){
    try {
        return $this->_connection->query($query);
    } catch(PDOException $e) {
        return "Error: " . $e->getMessage();
    }
}

public function fetch(){
    try {
        return $this->_statement->fetch();
    } catch(PDOException $e) {
        return "Error: " . $e->getMessage();
    }
}

public function prepare($query) {
    try {
        $this->_statement = $this->_connection->prepare($query);
        return 1;
    } catch(PDOException $e) {
        return "Error: " . $e->getMessage();
    }
}

public function execute($array) {
    try {
        $this->_statement->execute($array);
        return 1;
    } catch(PDOException $e) {
        return "Error: " . $e->getMessage();
    }
}

public function mysql_escape_mimic($inp) {
    if(is_array($inp))
        return array_map(__METHOD__, $inp);

    if(!empty($inp) && is_string($inp)) {
        return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $inp);
    }
    return $inp;
}
}

首先,当出现问题时,在
什么是
mysql\u escape\u mimic
之后添加这两行,如果您使用的是准备好的参数化查询语句,为什么要这样做呢?数组中有4个参数,只有2个值<代码>“从明细表中选择*,其中(起始日期介于:f1和:u1之间)或(结束日期介于:f2和:u2之间);”并相应地更改值数组以保存4个参数您还应该检查所有pdo调用的状态我将在
mysql\u escape\u mimic
中编辑,我尝试了您编写的查询,但结果也是空的,我不确定我应该在哪里声明
f1、f2、u1和u2
?另外,我如何检查pdo呼叫的状态?谢谢,这就成功了。我无法使
db->setAttribute…
部件正常工作,但我编辑了我的数组,使其看起来像你的数组,并修复了它。
<?php

class dbpdo {

private $_connection;
private $_statement;

public function __construct( ) {}

public function connect( $host, $username, $password, $database ) {
    $connect = 'mysql:host='.$host.';dbname='.$database.';charset=utf8mb4';
    $this->_connection = new PDO($connect, $username, $password);
    $this->_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $this->_connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}

public function __destruct() {
    if ($this->_connection)
        $this->_connection = null;
}

public function query($query){
    try {
        return $this->_connection->query($query);
    } catch(PDOException $e) {
        return "Error: " . $e->getMessage();
    }
}

public function fetch(){
    try {
        return $this->_statement->fetch();
    } catch(PDOException $e) {
        return "Error: " . $e->getMessage();
    }
}

public function prepare($query) {
    try {
        $this->_statement = $this->_connection->prepare($query);
        return 1;
    } catch(PDOException $e) {
        return "Error: " . $e->getMessage();
    }
}

public function execute($array) {
    try {
        $this->_statement->execute($array);
        return 1;
    } catch(PDOException $e) {
        return "Error: " . $e->getMessage();
    }
}

public function mysql_escape_mimic($inp) {
    if(is_array($inp))
        return array_map(__METHOD__, $inp);

    if(!empty($inp) && is_string($inp)) {
        return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $inp);
    }
    return $inp;
}
}
<?php
error_reporting(E_ALL); 
ini_set('display_errors', 1);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$newSlot = array(
                    ":f1" => $startDate->format('Y-m-d H:i:s')),
                    ":u1" => $endDate->format('Y-m-d H:i:s')),
                    ":f2" => $startDate->format('Y-m-d H:i:s')),
                    ":u2" => $endDate->format('Y-m-d H:i:s'))
                );


$query = "SELECT * FROM schedule_slot 
            WHERE (startDate BETWEEN :f1 AND :u1) 
               OR (endDate BETWEEN :f2 AND :u2)";

$result = $db->prepare($query);
// now execute the prepared query on $result not $db
$result = $result->execute($newSlot);

$row = $result->fetch_object();

print "slot: " . $row->startDate;