2012-04-26 47 views
-3

我做的後期編輯功能對於我的網站的職位,但我被困在此。這是我的代碼:PHP,編輯在MySQL數據庫

$post = htmlspecialchars($_GET["story"]); 
mysql_select_db("xxxxxx", $con); 

$sql="INSERT IGNORE INTO tool WHERE id=$post (title, details, author) 
VALUES 
('$_POST[title]','$_POST[details]','$_SESSION[Username]')"; 

if (!mysql_query($sql,$con)) 
{ 
    die('Error: ' . mysql_error()); 
} 
echo "The story<b> " . $_POST[title] . " </b>has been edited."; 

mysql_close($con) 

我知道這個錯誤與INSERT IGNORE INTO tool WHERE id=$post有關。我顯然不希望在數據庫中每一個崗位換到同樣的事情,所以我需要它來找到郵局的ID,這是$post,然後更改只是特定DB項目的信息。

+1

我聞到SQL注入!並考慮'error_reporting(E_ALL);'然後修復您得到的通知。 – ThiefMaster 2012-04-26 12:41:17

+2

聖SQL注入http://en.wikipedia.org/wiki/SQL_injection – djdy 2012-04-26 12:43:04

+3

讓我們不要忘記我們的老朋友XSS http://en.wikipedia.org/wiki/Cross-site_scripting#Safely_validating_untrusted_HTML_input – freshnode 2012-04-26 12:48:33

回答

2

而且SQL注入,如@ThiefMaster和@djdy反對(這是iminent)是更好的使用UPDATE查詢更新(編輯)現有條目(而不是INSERT忽略其中INSERT應該只用於插入新條目)。然後

您的查詢應該是:

$sql=" 
    UPDATE `tool` SET 
     `title` = '".mysql_real_escape_string($_POST['title'])."', 
     `details` = '".mysql_real_escape_string($_POST['details'])."', 
     `author` = '".mysql_real_escape_string($_SESSION['Username'])."' 
    WHERE `id` = $post;"; 

你必須逃離MySQL的保留字像id等,使用後引號。在傳遞給查詢的每個值上使用mysql_real_escape_string()也是一個非常好的習慣。

+0

id不是保留字; p – 2012-04-26 12:56:23

+0

得到通過我的工作現在...對不起那麼ORA迷茫... :-) 但如果'id'成爲不久的將來保留字,如果它逃脫它自己的查詢不會失敗今天:-) – shadyyx 2012-04-26 12:59:26

9

INSERT是新記錄,你需要的,如果你想改變一個記錄使用UPDATE。

0

必須使用的error_reporting functionality並獲得錯誤描述。所以你可以檢測你的錯誤。

而且編輯,您必須使用的東西記錄像

update posts set title = 'new title', content = 'new content' where post_id = <your_post_id> 

所以,你必須實現的功能,檢測(提供)獨特的帖子的ID。

1

哇,你有幾大誤區:

$post = mysql_real_escape_string($_GET["story"]); // why are you mixing $_POST and $_GET? 
$title = mysql_real_escape_string($_POST["title"]); // always escape user-generated input that's being put into a SQL query statement 
$detai = mysql_real_escape_string($_POST["details"]); 
$author = mysql_real_escape_string($_SESSION["Username"]); 

$sql = "UPDATE `tool` SET `title` = '$title', `details` = '$details', `author` = '$author' WHERE `id` = '$post'"; // correct syntax for an UPDATE query 

http://dev.mysql.com/doc/refman/5.5/en/update.htmlhttp://php.net/manual/en/function.mysql-real-escape-string.php