2015-05-20 32 views
0

我用了以下功能:綁定參數strip out下劃線?

function update_value($table, $field, $value, $type, $where1, $value1, $where2=NULL, $value2=NULL, $where3=NULL, $value3=NULL) { 

$rows = array(); 
global $conn; 
connect(); 
$value1 = "'" . $value1 . "'"; 
$sql = "UPDATE $table SET $field =? WHERE $where1 = $value1"; 

$bind1 = "'" . "$type" . "'"; 

if ($where2 != NULL) { 
    $value2 = "'" . $value2 . "'"; 
    $sql .= " AND $where2 = $value2"; 

} 
if ($where3 != NULL) { 
    $value3 = "'" . $value3 . "'"; 
    $sql .= " AND $where3 = $value3"; 
} 

$stmt = $conn->prepare($sql); 


$stmt->bind_param($type, $value); 

$stmt->execute(); 
$stmt->close(); 
$conn->close(); 
} 

...更新表的用戶名字段(確保它是通過上述功能更新前的字符串)。我嘗試使用字符串後跟下劃線進行更新,但是當它出現在表格中時,下劃線消失了。

我是新來的綁定參數,是否有某些東西被剝去?如果是這樣,我想知道到底是什麼讓我可以使用preg_match捕捉它們,然後更新並提醒用戶。

+0

*?「的確結合PARAM帶了下劃線」 * - * 「我試着更新一個字符串後跟一個下劃線,但是當它出現在表格中時,下劃線已經消失了。」* - 你問題的標題應該更像*「爲什麼綁定參數去掉下劃線?」* –

+1

綁定doesn'不要改變你提交的數據。如果你以前強調過,他們會在那之後。但是,由於您將「外部」數據直接放入查詢字符串中,因此您仍然很容易受到[sql注入攻擊](http://bobby-tables.com)的攻擊。 –

+0

該功能僅適用於我。在將數據放入函數之前,我會對數據進行清理。所以它不應該刪除下劃線?任何想法爲什麼會這樣? – thinkofacard

回答

0

您使用數據操作的方式非常危險。

但只是爲了解決一些潛在的問題,讓你的邏輯,你應該圍繞以反引號所有潛在的表和列名,並與mysqli_real_escape_string()準備值:

$val1 = "'" . mysqli_real_escape_string($value1) . "'"; 
$sql = "UPDATE `$table` SET `$field` = ? WHERE `$where1` = $val1"; 

if (!empty($where2)) { 
    $value2 = "'" . mysqli_real_escape_string($value2) . "'"; 
    $sql .= " AND `$where2` = $value2"; 

} 
if (!empty($where3)) { 
    $value3 = "'" . mysqli_real_escape_string($value3) . "'"; 
    $sql .= " AND `$where3` = $value3"; 
} 
+0

使用真正的轉義字符串的問題是,當我從表中讀取時,我需要以某種方式轉換它。 有沒有辦法做到這一點? – thinkofacard

+0

你不需要任何額外的編碼 - 它應該按原樣工作 – Alex