2014-01-20 5 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 />"; 

나는 $ stmt에와 $ 쿼리의 각 인스턴스를 교체, 그러나 그것은 작동하지 않았다. 그래서 나는 그것들을 $ row, $ sql 그리고 $ Total으로 바꾸었지만 아무것도 작동하지 않는다. 대부분의 경우 여전히 효과가 있습니다. 성별에 따라 표에 모든 이름을 표시 할 수 있습니다. 그러나 나이 또는 wpm 값을 입력하면 작동하지 않으며 일부 변수는 오류 메시지를 생성합니다.

누구나 $ query를 대체 할 항목을 알려 줄 수 있습니까?


$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'] 
}