2013-03-21 117 views
0

通過網站上的兩個頁面,我不打算永遠離開家裏的電腦,我想用表單將項目輸入到我的計算機上託管的MySQL數據庫中。我之前已經完成了幾乎完全相同的工作,但由於某種原因,這個工作並不成功。我並不擔心這個或其他類似的安全問題,因爲它不會離開我自己的電腦,我只是希望它能夠真正起作用。將項目從表格插入到MySQL數據庫中

形式:

<form action='addclothes.php' method='post'><table style="font-family:verdana;font-size:14px;color:#004766;"><tr><td> 
Type of clothing:</td><td><select name="type"> 
<option value="0">---</option> 
<option value="dresses">Dress</option> 
<option value="tops">Top</option> 
<option value="bottoms">Bottom</option> 
<option value="shoes">Shoes</option> 
<option value="accessories">Accessory</option></select></td></tr> 
<tr><td>Name:</td><td><input type="text" name="name"></td></tr> 
<tr><td>Path to full image:</td><td><input type="text" name="largeimagepath"></td></tr> 
<tr><td>Path to thumbnail:</td><td><input type="text" name="smallimagepath"></td></tr> 
<tr><td colspan="2"><center><input type="submit" value="Submit" name="submit"></center></td></tr> 
</table></form> 

即發送到addclothes.php,它看起來像這樣,裝在HTML保持相同的佈局:

<?php 

$name = $_POST['name']; 
$table = $_POST['type']; 
$largepath = $_POST['largeimagepath']; 
$thumbpath = $_POST['smallimagepath']; 

    $db = mysql_connect("localhost", "root", "******") or die(mysql_error()); 
    mysql_select_db("Default") or die(mysql_error()); 

    $query = "INSERT INTO clothes."{$table}" (name, imagepath, thumbimagepath) 
VALUES("{$name}", "{$largepath}", "{$thumbpath}")"; 
    mysql_query($query) or die(mysql_error()); ?> 

<p>Item Added!</p> 

它涉及到下一個頁面,只是無論如何說「項目添加」。如果我在創建不顯示的變量之後嘗試回顯查詢。

+4

您正在使用[an **過時的**數據庫API](http://stackoverflow.com/q/12859942/19068)並應使用[現代替換](http://php.net/manual/) EN/mysqlinfo.api.choosing.php)。你也**易受[SQL注入攻擊](http://bobby-tables.com/)**,現代的API會使[防禦]更容易(http://stackoverflow.com/questions/60174/best-way-to-prevent-sql-injection-in-php)自己從。 – Quentin 2013-03-21 14:00:04

+0

您的字符串連接中有語法錯誤,我希望這會導致PHP拋出一個分析錯誤。 (事實上​​,這並不重要,因爲根據我以前的評論,您應該從查詢構建中消除字符串連接。) – Quentin 2013-03-21 14:01:54

回答

1

這是錯誤的:

$query = "INSERT INTO clothes."{$table}" (name, imagepath, thumbimagepath) 
      VALUES("{$name}", "{$largepath}", "{$thumbpath}")"; 

您將需要使用單引號的查詢中,以避免破壞它(你不要引用表的名稱;如果它可以在MySQL中的保留字使用反推:

$query = "INSERT INTO clothes.`{$table}` (name, imagepath, thumbimagepath) 
      VALUES('{$name}', '{$largepath}', '{$thumbpath}')"; 

另外請注意,安全/ SQL注入不僅僅是爲了保護你的人與壞的意圖;如果您沒有準備好數據以用於sql查詢,即使您自己輸入了有效數據 - 也可能會中斷查詢/應用程序,例如名稱中包含'字符(例如O'Neill ...)。

所以安全性總是很重要,這就是爲什麼你應該切換到PDO(或mysqli)並準備好語句。除此之外,mysql_*函數已被棄用。

最後一個評論:如果你打開你的網站到外部世界,沒有準備或轉義將保護你的查詢中的表名;您需要檢查允許的表名稱列表以避免sql注入。

0
<?php 
    $name = $_POST['name']; 
    $table = $_POST['type']; 
    $largepath = $_POST['largeimagepath']; 
    $smallpath = $_POST['smallimagepath']; 

    $name = htmlentities($name); 
    $table = htmlentities($table); 
    $largepath = htmlentities($largepath); 
    $smallpath = htmlentities($smallpath); 

    $connection = new PDO('mysql:host=localhost;dbname=Default','root','*****'); 
    $query = $connection->prepare('INSERT INTO :table (name,imagepath,thumbimagepath) VALUES (:name,:image,:thumb)'; 

    $query->bindParam(':table', $table); 
    $query->bindParam(':name', $name); 
    $query->bindParam(':image',$largepath); 
    $query->bindParam(':thumb',$smallpath); 
    $query->execute(); 

    if($query->rowCount()) { 
     echo "Inserted correctly"; 
    } else { 
     echo "Failure inserting"; 
    } 
?> 

正如其他人所說的,你真的不應該讓別人通過表單輸入表名。