2013-08-10 34 views
5

Tôi có một mẫu tìm kiếm để lấy một số bản ghi. Một trong những lĩnh vực hạn chế đối với hình thức là record, là một hộp thả xuống trông như thế này:Trường SQL đang được in dưới dạng chuỗi

<select name="record" id="record"> 
<option value="1">Highest Score</option> 
<option value="2">Most runs</option> 
</select> 

Sau đó, khi họ tìm kiếm đoạn mã sau chạy:

if (isset($_GET['action']) and $_GET['action'] == 'search') 
{ 
    include $_SERVER['DOCUMENT_ROOT'] . '/stats/includes/db.inc.php'; 

    $placeholders = array(); 

    if($_GET['record'] == '1'){ 
     $placeholders[':record'] = 'runs'; 
    } else if($_GET['record'] == '2'){ 
     $placeholders[':record'] = 'SUM(runs)'; 
    } 

    $select = 'SELECT playerid, :record as record, user.usertitle'; 
    $from = ' FROM cricket_performance p INNER JOIN user ON p.playerid = user.userid'; 
    $where = ' WHERE TRUE'; 

    if ($_GET['team'] != '') 
    { 
    $where .= " AND team = :team"; 
    $placeholders[':team'] = $_GET['team']; 
    } 

    if ($_GET['record'] != '') 
    { 
    $where .= " ORDER BY :record DESC"; 
    } 

    $where .= " LIMIT 10"; 

    try 
    { 
    $sql = $select . $from . $where; 
    $s = $pdo->prepare($sql); 
    $s->execute($placeholders); 
    } 
    catch (PDOException $e) 
    { 
    $error = 'Error fetching record'; 
    include 'form.html.php'; 
    exit(); 
    } 

    foreach ($s as $row) 
    { 
    $records[] = array('playerid' => $row['playerid'], 'record' => $row['record'], 'usertitle' => $row['usertitle'], '1' => $row['1']); 
    } 
    include 'form.html.php'; 
    exit(); 
} 

Và làm việc hoàn toàn tốt đẹp, ngoại trừ vì một điều. Điều này: $placeholders[':record'] = 'runs'; là khá nghĩa đen được in trong SQL là 'chạy', thay vì trường runs được chọn từ cơ sở dữ liệu, vì vậy $record['record'] sẽ được in dưới dạng 'chạy' cho mỗi mục nhập, thay vì số được chọn ra khỏi bảng .

nếu những trích dẫn được thay thế bằng "" điều tương tự xảy ra, và nếu thay thế bằng '' có gì xảy ra (kết quả trống)

Trả lời

1

Bạn không nên sử dụng giữ chỗ cho bảng hoặc trường tên. Sử dụng một biến thay vào đó, giá trị không cần phải được vệ sinh.

"SELECT playerid, ".$field." as record, user.usertitle" 
+0

Tuyệt vời, cảm ơn bạn – cameronjonesweb

0

PDO dự kiến ​​tham số ràng buộc là giá trị, ví dụ: Mệnh đề WHERE. Do đó

$s = $pdo->prepare($sql); 
$s->execute($placeholders); 

sẽ không hoạt động như mong đợi. PDO tạo từ

SELECT playerid, :record as record, user.usertitle 

cái gì đó như

SELECT playerid, 'runs' as record, user.usertitle 

và cố gắng để thực thi.

Các vấn đề liên quan