2016-10-10 117 views
-1

我对php和pdos非常陌生。我的一位朋友基本上创建了一个pdo类和一些如何使用它的例子,这对我来说非常有用。但是现在我想要使用BETWEEN mysql关键字执行查询,并返回与条件匹配的任何内容,但它只是空白。我创建了mysql_query.log文件,并从我可以从中收集的查询准备好但未执行。我会告诉你从日志中第二我的发现,让我赶紧只是告诉你我的代码:php pdo准备查询但不执行它

$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 20:59:31  
    2 Connect [email protected] as anonymous on test 
    2 Prepare SELECT * FROM schedule_slot WHERE (startDate BETWEEN ? AND ?) OR (endDate BETWEEN ? AND ?)   
    2 Close stmt     
    2 Quit 

下面是从日志查询的一个例子,实际上制定了罚款对我来说:

161010 21:01:07  
    3 Connect [email protected] 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; 
} 
} 
+1

什么是'mysql_escape_mimic',如果你正在使用一个准备好的参数化查询语句,为什么你会这样做呢 – RiggsFolly

+0

你有4个参数,只有2个值在数组中! – RiggsFolly

+0

'“SELECT * FROM schedule_slot WHERE(startDate BETWEEN:f1 AND:u1)OR(endDate BETWEEN:f2 AND:u2);”;'和chnage相应的数组以保存4个参数 – RiggsFolly

回答

2

一是当事情进展不对您<?php标记为之后添加这两条线很多人在LIVE服务器上开发,在这些服务器上错误报告当然会被关闭,并且假设他们的代码没有问题,但实际上它会产生很多错误。

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

然后设置PDO如果发生任何错误,你会看到他们在页面上抛出异常

$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; 

现在,否则你会看到一个异常抛出,但没有抓到,这样也将显示在网页

+0

谢谢你,这个伎俩。我无法使'db-> setAttribute ...'部分工作,但我编辑我的数组看起来像你的修复它。 – PrintlnParams