2014-01-20 86 views
0

幾天前,我從教程中獲得了第一份工作的AJAX腳本。唯一的問題是它是用一個「老式的」數據庫查詢編寫的。我不得不升級代碼以使其與PDO兼容 - 但我沒有完成這項工作。AJAX/PDO衝突(PHP/MySQL)

它工作到一個點;我可以顯示基於性別的人員列表。但是,當我嘗試按年齡或wpm優化我的列表時,它不起作用。

這是原始查詢:

$query = "SELECT * FROM ajax_example WHERE sex = '$sex'"; 

那麼明顯的問題是,留在我的代碼三個$查詢變量:

$query .= " AND age <= $age"; 
$query .= " AND wpm <= $wpm"; 
echo "Query: " . $query . "<br />"; 

我換成$查詢的每個實例有$語句,但它不起作用。所以我用$ row,$ sql甚至$ Total替換它們,但沒有任何效果。在大多數情況下,它仍然有用 - 我可以在表格中根據性別顯示每個名字。但是,當我輸入年齡或wpm的值時,它不起作用(並且某些變量會產生錯誤消息)。

任何人都可以告訴我用什麼替換$查詢?


$age = $_GET['age']; 
$sex = $_GET['sex']; 
$wpm = $_GET['wpm']; 

//build query 
$sql= "SELECT * FROM ajax_example WHERE sex = :sex"; 
$stmt = $pdo->prepare($sql); 
$stmt->bindParam(':sex',$sex,PDO::PARAM_STR); 
$stmt->execute(); 
$Total = $stmt->fetch(); 

if(is_numeric($age)) 
$query .= " AND age <= $age"; 
if(is_numeric($wpm)) 
$query .= " AND wpm <= $wpm"; 
//Execute query 

try { 
$stmt->execute(); 
} catch (Exception $e) { 
// print_r($e); // Do something more useful here, like log. 
} 

//Build Result String 
$display_string = "<table>"; 
$display_string .= "<tr>"; 
$display_string .= "<th>Name</th>"; 
$display_string .= "<th>Age</th>"; 
$display_string .= "<th>Sex</th>"; 
$display_string .= "<th>WPM</th>"; 
$display_string .= "</tr>"; 

// Insert a new row in the table for each person returned 
while ($row = $stmt->fetch()) 
{ 
$display_string .= "<tr>"; 
$display_string .= "<td>$row[name]</td>"; 
$display_string .= "<td>$row[age]</td>"; 
$display_string .= "<td>$row[sex]</td>"; 
$display_string .= "<td>$row[wpm]</td>"; 
$display_string .= "</tr>";  
} 

echo "Query: " . $query . "<br />"; 
$display_string .= "</table>"; 
echo $display_string; 

回答

3

你必須建立整個查詢字符串中$sql第一,你準備在它之前,綁定參數和執行。

//build query 
$sql= "SELECT * FROM ajax_example WHERE sex = :sex"; 
if(is_numeric($age)) { 
    $sql .= " AND age <= :age"; 
} 
if(is_numeric($wpm)) { 
    $sql .= " AND wpm <= :wpm"; 
} 
$stmt = $pdo->prepare($sql); 
$stmt->bindParam(':sex',$sex,PDO::PARAM_STR); 
if (is_numeric($age)) { 
    $stmt->bindParam(':age', $age, PDO::PARAM_INT); 
} 
if(is_numeric($wpm)) { 
    $stmt->bindParam(':wpm', $wpm, PDO::PARAM_INT); 
} 
$stmt->execute(); 

//Execute query 
try { 
    $stmt->execute(); 
} catch (Exception $e) { 
    // print_r($e); // Do something more useful here, like log. 
} 
+0

哇,我還有很多東西需要學習;我認爲bindParam的東西以查詢結束! –

+0

不確定你的意思。它在執行查詢之前必須完成。 bindParam的東西不是直接將變量替換爲查詢字符串。 – Barmar

1

在PDO中使用未命名參數進行動態查詢並將它們作爲execute()中的數組傳遞會更容易。除非至少輸入$_GET['sex']參數,否則該語句將不會執行。我留下了派生語句的回聲和數組的轉儲。

$age = isset($_GET['age']) ? $_GET['age'] : NULL; 
$wpm = isset($_GET['wpm']) ? $_GET['wpm'] : NULL; 
if(isset($_GET['sex'])){ 
    $params =array($_GET['sex']); 
    //build query 
    $sql= "SELECT * FROM xajax_example WHERE sex = ?"; 
    if(is_numeric($age)){ 
     $sql .= " AND age ?"; 
     array_push($params,$age); 
    } 
    if(is_numeric($wpm)){ 
     $sql .= " AND wpm ?"; 
     array_push($params,$wpm); 
    } 
    echo $sql;//Test 
    print_r($params);//Test 
    $stmt = $dbh->prepare($sql); 
    $stmt->execute($params); 
}else{ 
    echo "No Sex";//Default message for no $_GET['sex'] 
}