Tôi có một hàm (xem dưới) trong PHP, truy vấn cơ sở dữ liệu MySQL. Khi tôi sử dụng các giá trị sau:PHP PDO: Truy vấn SQL không trả về kết quả mong đợi
- $ map => 1,
- $ giới hạn => 10,
- $ từ => 0,
- $ to => CURRENT_TIMESTAMP
Với câu lệnh 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
Trong phpMyAdmin, tôi nhận được ông sau kết quả:
Tuy nhiên, PHP PDO được trả lại một mảng trống.
nỗ lực của tôi để debug cho đến nay:
- tôi đã thay thế ông chuẩn bị truy vấn SQL với giá trị tĩnh thay vì placeholders - Trả đúng
- Cố gắng từng giữ chỗ riêng biệt, thay thế phần còn lại với thử nghiệm giá trị mã hóa cứng - Trả về không có gì
- Thay vì truyền biến cho trình giữ chỗ, tôi chuyển các hằng số cố định trong phần thực thi (Array()). - Không trả lại gì cả.
- Tôi đã phát hiện thêm sau khi bật nhật ký truy vấn mySQL, rằng máy khách PHP Kết nối, nhưng sau đó thoát mà không gửi bất kỳ truy vấn nào.
Từ đây, tôi tin rằng đó là vấn đề với người nắm giữ vị trí trong hàm, tuy nhiên tôi không thể tìm thấy lý do tại sao họ không thực hiện được. Điều này có thể xảy ra nhất ở phía PHP, vì không có lỗi nào được MySQL đưa vào tệp lỗi.
Đây là chức năng Tôi đang sử dụng, với các biến được thông qua tại:
- $ map => 1,
- $ giới hạn => 10,
- $ từ => 0,
- $ để => 0
Chức năng:
/**
* 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;
}
CHỈNH SỬA
Format của bảng MySQL:
Tôi đã thử outputting $ conn-> errorInfo() ;, tuy nhiên như không có lỗi được ném, Tôi được trả lại một mảng giá trị: [00000, null, null]
Hàm request_connection chỉ trả về kết quả của hàm này và nó đang làm việc cho tất cả các câu lệnh khác của tôi.
/**
* 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);
}
}
Cảm ơn
Loại dữ liệu của cột 'dấu thời gian' là gì? – mimimito
@RodolfoAndrade Xem câu hỏi cập nhật –
Tôi đã xóa câu trả lời cho câu hỏi của bạn. Tôi giả sử rằng bạn đang sử dụng dấu thời gian UNIX ('INT') cho bảng của bạn và không phải là cột dấu thời gian. – helmbert