我在PHP中有一个函数(见底部),它查询MySQL数据库.当我使用以下值时:
$ map => 1,
$ limit => 10,
$ from => 0,
$ to => CURRENT_TIMESTAMP
使用SQL语句:
SELECT user, scoreVal AS score, UNIX_TIMESTAMP(timestamp) AS timestamp FROM Score WHERE timestamp >= :from AND timestamp <= :to AND map = :map ORDER BY scoreVal DESC, timestamp ASC LIMIT :limit
在phpMyAdmin中,我得到以下结果:
但是PHP PDO返回一个空数组.
我到目前为止尝试调试:
我已经用静态值而不是占位符替换了他准备的SQL查询 - 正确返回
分别尝试每个占位符,用经过测试的硬编码值替换其余的 - 不返回任何内容
我没有将变量传递给占位符,而是在execute(Array())部分传递固定常量. - 什么都不返回.
我在打开mySQL查询日志之后进一步发现,PHP客户端连接,但随后退出而不发送任何查询.
由此,我认为这是函数中占位符的一个问题,但是我一直无法找到他们失败的原因.这很可能发生在PHP端,因为MySQL没有错误抛出错误文件.
这是我正在使用的函数,传入的变量是:
$ map => 1,
$ limit => 10,
$ from => 0,
$ to => 0
功能:
/** * Gets the highscore list for the map in that timespan * @param integer $map Id of map for which to fetch the highscore * @param integer $limit Maximum no. of records to fetch * @param integer $from Timestamp from when to find rank * @param integer $to Timestamp up to when to find rank * @return array Array of highscores arranged by rank for the map in the format [{"user"=>$user,"score"=>score,"timestamp" => timestamp}] */ function get_highscore_list($map,$limit,$from,$to){ $sql = "SELECT user,scoreVal AS score,UNIX_TIMESTAMP(timestamp) AS timestamp FROM Score WHERE timestamp >= :from AND timestamp <= :to AND map = :map ORDER BY scoreVal DESC, timestamp ASC LIMIT :limit"; if ($to==intval(0)){ $max =1; $sql = str_replace(":to","NOW()",$sql,$max); } try{ $conn = request_connection(); $stmt = $conn->prepare($sql); $stmt->execute(array(':map'=>$map,':from'=>$from,':limit'=>$limit)); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); }catch(PDOException $e){ $_POST["exception"]=$e; continue; } return $result; }
EDITS
MySQL表的格式:
我已经尝试输出$ conn-> errorInfo();但是由于没有抛出错误,我得到一个值数组:[00000,null,null]
request_connection函数只返回此函数的结果,它适用于我的所有其他语句.
/** * Creates a new PDO connection to the database specified in the configuration file * @author Ignacy Debicki * @return PDO A new open PDO connection to the database */ function create_connection(){ try { $config = parse_ini_file('caDB.ini'); $conn = new PDO('mysql' . ':host=' . $config['dbHost'] . ';dbname=' . $config['db'],$config['dbPHPUser'], $config['dbPHPPass']); date_default_timezone_set($config['dbTimezone']); return $conn; } catch(PDOException $e){ throw new Exception("Failed to initiate connection",102,$e); } }
谢谢