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