2017-09-13 57 views
1

考慮以下問題,我正在嘗試將Ajax建立到PHP/MySQL的自定義查詢。請選擇...從...帶有Ajax的地方

Javascript代碼:

var i=2; 
fetchFromDBPHP("name", "tblperson", "id="+i);  

function fetchFromDBPHP(column, table, condition) { 
    $.ajax({ 
     type: "post", 
     url: "./php/fetchFromDB.php", 
     dataType: 'json', 
     data: { column: column, table: table, condition: condition }, 
     success: function(data) { 
      console.log("Fetched data from PHP:" + data); 
     }, 
     error:function(request, status, error) { 
      console.log("Reading PHP database went wrong. Error " + request.responseText); 
     } 
    }); 
} 

PHP代碼:

<?php 
    $column = $_POST['column']; 
    $table = $_POST['table']; 
    $condition = $_POST['condition']; 

    if (isset($table)) { 
     $sql = "SELECT " . intval($_POST['column']) . " FROM " . intval($_POST['table']) . " WHERE " . intval($_POST['condition']); 
     $con = mysqli_connect("localhost", "root", "bloh", "blah"); 
     if (!$con) { 
      die("Connection failed: " . mysqli_error($con)); 
     } 
     $result = mysqli_query($con, $sql); 
     $to_encode = array(); 
     while($row = mysqli_fetch_array($result, MYSQLI_NUM)) { 
      $to_encode[] = $row; 
     } 
     echo json_encode($to_encode); 
     mysqli_close($con); 
    } 
?> 

我的表可以是類似的:

tblperson

id name firstname tel 
1 Dalton Jack  555-5555 
2 Smith John  555-6666 
3 Doe  John  555-7777 

我想要做的就是類似的查詢發送給

SELECT something FROM mytable WHERE condition=that 

使用Ajax。 我有一個錯誤消息,並沒有檢索到任何東西。

+0

爲什麼你使用'intval()'? –

+0

我試過沒有,但我仍然有我的錯誤消息。我同意,這不是必需的。 – EricF

+0

你有沒有檢查你的網絡標籤? –

回答

0

刪除intVal它使字0:檢查這https://eval.in/860766

$column = $_POST["column"]?:""; 
    $table = $_POST["table"]?:""; 
    $condition = $_POST["condition"]?:""; 
    if($column && $table && $condition){ 
     $sql = "SELECT `$column` FROM `$table` WHERE $condition"; 
    }else{ 
     die("Something went wrong."); 
    } 

還要確保有關條件的字符串類型值,比方說,列address

fetchFromDBPHP("name", "tblperson", "id='"+address+"'"); 

使用引號',使其會是正確的查詢喜歡或使這樣的條件在這樣的PHP

$condition = explode("=",$condition); 
if(!is_numeric($condition[1])){ 
$condition[1] = "'".$condition[1]."'"; 
} 
$condition = implode("=",$condition); 

演示:https://eval.in/860838,做出這樣的查詢

SELECT something FROM mytable WHERE condition='that' 

您可以使用上面的代碼作爲第一步,不要在生產中不使用,使一個步驟,使其parameterized或使用pdo

+0

**危險!不要使用這個代碼!**:它很容易受到[SQL注入攻擊](http://bobby-tables.com/)**,你需要[抗辯](http://stackoverflow.com/問題/ 60174/best-way-to-prevent-sql -injection-in-php)自己從。 – Quentin

+0

@昆汀丁:我完全同意你的看法。我已經更新並且最後放了一個註釋來使用'parameterized'或'pdo'。或者我應該刪除這個答案? – C2486

+1

如果答案是「您正在使用一種SQL注入防禦形式,專門用於當輸入應該是一個數字但輸入不是數字時」,那麼我會建議通過以下方法並顯示正確的方式做保護或投票來關閉參考SQL注入問題的副本,並對問題進行評論,指出選擇了錯誤的方法。 – Quentin

0

感謝「user2486」,我的代碼是錯誤的。正確的使用方法是:

fetchFromDBPHP("name", "tblperson", "id='"+address+"'"); 

但是,我也有「昆汀」同意,他的代碼的其餘部分很容易受到SQL注入式攻擊。