2016-09-02 99 views
1

我有一個HTML表單,從一個PHP腳本中提取值,如下圖所示:如何同時處理撇號和雙引號在PHP

$dbc = mysqli_connect("all required info here...") or die("Error occurred"); 

$sent = "Any sentence here...which may contain apostrophe or double quotes or both"; 

$query = "SELECT * FROM myrecord WHERE sentence = '$sent'"; 
$result = mysqli_query($dbc, $query); 
$data = mysqli_fetch_array($result); 
mysqli_close($dbc); 

的問題是,該變量$sent可以包含任何字符串與的撇號或雙引號或兩者的組合。這會在執行mysqli_query()時出錯。 所以,即使我逃避的$sent初始化它仍將爲mysqli_query()執行等問題雙引號。如果我爲「和」逃脫,那麼$sent的值不會保留它實際需要的值(儘管我不確定是否轉義'和'將起作用或不起作用)。

是否有任何內置的功能,可自動轉義字符串的所有特殊字符?或解決此問題的任何解決方法?

[P.S.我已經搜查計算器一些以前的問題,一直沒能找到解決的辦法。]你想

回答

2

什麼,以及你應該做的是使用準備好的語句(參數化查詢)。隨着PDO,這將是這個樣子:

$stmt = $pdo->prepare('SELECT * FROM myrecord WHERE sentence = :sentence'); 
$stmt->execute([':sentence' => $sentence]); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    //do stuff 
} 

mysqli支持他們,太,但API稍微繁瑣(IMO) - 見mysqli_prepare docs的細節:

$stmt = $mysqli->prepare('SELECT * FROM myrecord WHERE sentence = ?'); 
//or $stmt = mysqli_prepare($connection, $query); 

然後,你綁定參數使用bind_param(該值到WHERE子句中使用):

$stmt->bind_param('s', $sentence); 
//or mysqli_stmt_bind_param($stmt, 's', $sentence); 

然後調用execute - 或mysqli_stmt_execute,並使用fetch獲取結果 - 或者mysqli_stmt_fetch ...


正如在評論中提到:參數和查詢字符串不必以任何方式被引用,因爲它們作爲單獨的治療實體。其結果是,你可以重新使用相同的準備語句不同paramters:

$stmt = $pdo->prepare('SELECT * FROM table WHERE field = :field'); 
$fieldVals = [123, 46, 32]; // three values: 
$results = array_fill_keys($fieldVals, null); 
foreach ($fieldVals as $val) { 
    $stmt->execute([':field' => $val]);//execute with each value in $fieldVals array 
    $results[$val] = $stmt->fetchAll(PDO::FETCH_ASSOC); // fetch results for this field value 
    //optional, but good form: 
    $stmt->closeCursor(); 
} 

你現在用同樣的語句3次,但只需要發送的查詢字符串一次。該查詢必須被解析並處理一次,之後,您只需將參數發送給數據庫。這種方法通常更快,更安全(準備好的聲明可以保護大多數注入攻擊),並且更好。

+0

這會不會創建'$ pdo-)煩惱>準備('如果字符串包含撇號? – Lincoln

+0

@Lincoln你不需要再使用撇號。 –

+0

@Lincoln:Nope,':sentence'是一個佔位符,它不是查詢的實際部分。它的工作方式是查詢,將佔位符發送到數據庫,在數據庫中進行解析並構建執行計劃,然後在調用'execute'時,將參數值分開發送並放入適當位置,_resulting_ query被執行。結果是,不需要像引號那樣轉義字符,因爲參數和查詢字符串本質上是獨立處理的。另一個好處是,您可以重新使用準備好的語句(我將以示例更新答案) –