2012-12-27 26 views
0

我創建了一個表單,它將數據插入MySQL數據庫。這裏是表單字段,它們是<form>的一部分,但是,我沒有在這裏顯示整個表單,只是創建問題的字段。無法使用準備聲明將鏈接插入到MySql中

<tr> <td>Top 728x90 As</td><td><textarea name='topad'><?=$r['topad']?></textarea></td</tr> 
<tr> <td>Sidebar 250x250 Ad</td><td><textarea name='sidebarad'><?=$r['sidebarad']?></textarea></td></tr> 

這部分代碼處理輸入並將其插入到數據庫中。

if(isset($_POST['submit'])) { 

    $topad = $_POST['topad']; 
    $sidebarad = $_POST['sidebarad']; 

    $update = $connection->prepare("UPDATE site SET topad = '$topad' , sidebarad = '$sidebarad' WHERE id=1"); 
    $update->execute(array()); 
} 

與此代碼的問題是,它不接受/處理涉及<a href="#"> & </a>碼的數據的一部分。這不是關於轉義HTML字符,因爲所有其他HTML標記,如<img>等都顯示爲它,這是我想要的。

因此,無論何時插入標籤,它都會消失,既不會插入數據庫,也不會在按下提交按鈕後顯示在表單中。

更新:當使用雙引號插入鏈接時,它將被接受。如果我使用單引號,則不處理。例如。 <a href="someurl">將被DB接受,而<a href='someurl'>不會。

爲什麼會發生此錯誤?

+0

這是因爲您使用錯誤的方法來替代變量。你應該使用'placeholder'並綁定參數 –

+0

爲什麼你沒有佔位符準備它。這與SQL注入一樣容易受到任何未經處理的查詢的影響。在嘗試使用數據庫做東西之前,請閱讀[這篇文章](http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers):) – PeeHaa

+0

如何在更新數據庫時使用bind param?如何使用佔位符進行準備? – Rohitink

回答

1

原因是因爲您使用的是準備好的語句,但這些值沒有參數化。嘗試下面,

$topad = $_POST['topad']; 
$sidebarad = $_POST['sidebarad']; 

$update = $connection->prepare("UPDATE site SET topad = :topad , sidebarad = :sidebarad WHERE id=1"); 
$update->execute(array(':topad' => $topad, ':sidebarad' => $sidebarad)); 
+1

謝謝。有效。我曾經認爲,僅僅使用預準備語句就足以防止SQL注入。不要再想了:) – Rohitink

+0

不客氣。祝你聖誕快樂:D' –