2015-06-12 231 views
0

我寫了一個應該打印表格輸出的php代碼。MySQL準備語句失敗

function getPlanets($x, $y) { 

    $stmt = $this->MySQLConnection->prepare("SELECT * FROM planets WHERE (x >= (? - 50) AND x <= (? + 50)) AND (y >= (? - 50) AND y <= (? - 50))"); 

    $stmt->bind_param("iiii", $x, $x, $y, $y); 
    $stmt->execute(); 
    $stmt->store_result(); 

    if($this->MySQLConnection->errno) { 
     printf("SQL-Error: %s\n" + $this->MySQLConnection->error); 
    } 

    if($stmt->num_rows == 0) { 
     return json_encode(array("error" => "0"), JSON_PRETTY_PRINT); 
    } 

    $infoArray = array(); 

    while($obj = $stmt->get_result()->fetch_object()) { 
     $infoArray["id"] = $obj->id; 
     $infoArray["name"] = $obj->name; 
     $infoArray["x"] = $obj->x; 
     $infoArray["y"] = $obj->y; 
     $infoArray["systems"] = $obj->systems; 
    } 
} 

問題是,num_rows始終返回「0」。 如果我使用普通的MySQLi-Query,它使用相同的SQL-Command。

回答

3

錯字:

[..snip..](x >= (? - 50) AND x <= (? + 50)) AND (y >= (? - 50) AND y <= (? - 50))") 
                      ^--- 

指示的點也許應該+。由於寫的,它基本上解析爲where y = ?

您可以簡化這個有很多:

WHERE (? BETWEEN (x-50) AND (x+50)) AND (? BETWEEN (y-50) AND (y+50)) 
or 
WHERE (abs(x - ?) <= 50) AND (abs(y - ?) <= 50) 
+0

注:與建議重寫,MySQL不能在索引使用範圍掃描與領先的X或Y的列。 – spencer7593

+0

謝謝,我試過了,但它不起作用。如果我使用bind_result,則變量全部爲空。 – ForJ9

+0

你正在獲取一個對象,但試圖把它當作一個數組......'var_dump($ obj)'會告訴你你必須處理的事情。 –