2013-10-06 57 views
0

我試圖更新多個記錄使用一種形式,但已嘗試使用功能時遇到問題。使用數組PHP的addslashes

的形式如下:

<form name="form1" method="post" action="editnewscategorysubmit.php"> 
<table width="405"> 
<tr> 
<td width="246"><span class="link1">News Category </span></td> 
<td width="146" colspan="2"><span class="link1">Delete?</span></td> 
</tr> 
<tr> 
<td> 
<input type='text' name='title[]' value='$title' style='width:700px;'> 
<input type='hidden' name='id[]' value='$id'> 
</td> 
<td> 
<div style='padding-left:8px;'><a onclick='return confirmSubmit()' href='deletenewscategory.php?id=$id'><img src='images/delete.jpg' border='0'></a></div> 
</td> 
</tr>        
<tr> 
<td><input name="image" type="image" src="images/submit.png" alt="Submit Form" border="0" /></td> 
<td colspan="2">&nbsp;</td> 
</tr> 
</table> 
</form> 

是處理這個看起來像這樣的PHP代碼:

$identity = $_REQUEST['id']; 
$title = addslashes($_REQUEST['title']); 
include 'connection.php'; 
for($i=0;$i<count($identity);$i++) 
{ 
$query = "update newscategory set title = '$title[$i]' where id = '$identity[$i]'"; 
$result = mysql_query($query) or die(mysql_error()); 
} 
echo "Success. The news categories were updated."; 
include 'return.php'; 

返回的警告是:

警告:和addslashes ()期望參數1是字符串,在 /home/u180175506/public_html/editnewscategorysubmit.php中給出的數組上線71

我所試圖做的是和addslashes(或從什麼我讀,使用mysql_real_escape_string是首選!),以之前更新表的每個值。有什麼我失蹤?謝謝!

+1

你不應該使用mysql_ *功能更多,他們在10年前所取代...... – JimL

+1

我很好,你使用mysql_函數(提供你意識到的警告),但使用addslashes()來轉義查詢參數是一個真的,真的很糟糕的主意。 – symcbean

回答

2

有多種方法可以在數組上運行某些功能。一個簡單的循環:

$stillNotSafeData = array(); 
foreach ($_REQUEST as $key => $value) { 
    if (!is_array($value)) { 
     $stillNotSafeData[$key] = addslashes($value); 
    } else { 
     foreach ($value as $innerKey => $innerValue) { 
      $stillNotSafeData[$key][$innerKey] = addslashes($innerValue); 
     } 
    } 
} 

或者使用array_walk_recursive

array_walk_recursive($_REQUEST, function(&$item, $key) { 
    $item = addslashes($item); 
}); 

但是,正如你已經注意你不應該使用addslashes這一點。但是,一旦使用mysql_*函數與mysql建立了有效連接,則可以使用mres執行同樣的操作。

但你們都不應該那樣做。 mysql_*函數已經被廢棄一段時間了(並且將在不到一年的時間內從語言核心中移除)。

除了這個事實將被刪除不久也有一些「邊緣」的情況下,其繞過它:SQL injection that gets around mysql_real_escape_string()

長話短說:停止使用mysql_ *函數。

你真正想要做的是使用mysqliPDO。這些支持預準備語句和綁定參數。這篇文章將幫助您與此:How can I prevent SQL injection in PHP?

0
array_map('addslashes', $_REQUEST['title']); 

http://php.net/manual/en/function.array-map.php

Ofcourse還有其他的方式申請功能,每個數組元素。您可以foreach()它,並將addslashes()應用於每個值,或者在for循環中將$ var分配給addslashes($ title [$ i])。

5

功能:

function addslashes_recursive($data) 
{ 
    if (is_array($data)) 
    { 
     return array_map('addslashes', $data); 
    } 
    else 
    { 
     return addslashes($data); 
    } 
} 

單線

$array = array_map('addslashes', $array);