2011-07-11 154 views
1

所以我有這樣的代碼,需要消息/發佈用戶插入和它的意圖將其發佈到數據庫,然後顯示和單獨的頁面。香港專業教育學院得到了展示園做工精細它只是試圖插入到數據庫這是問題
這個代碼...發佈到數據庫

<?php 
mysql_connect("localhost", "root", ""); 
mysql_select_db("test");  
$time = time(); 
mysql_query "INSERT INTO threads (title, message, author, dated);" 
VALUES (NULL,'$_POST[title]','$_POST[message]','$_POST[author]','0','$time');  
echo "Thread Posted.<br><a href='Untitled9.php'>Return</a>"; 
?> 

的信息來源不會上傳到數據庫中!

這是爲什麼?如何解決?

id  int(11)       No None AUTO_INCREMENT    
    title varchar(255) latin1_swedish_ci No None     
    message text   latin1_swedish_ci No None     
    author varchar(255) latin1_swedish_ci No None     
    replies int(11)       No None     
    posted varchar(255) latin1_swedish_ci No None     
    votes_up int(11)       No 0     
    votes_down int(11)      No 0 
+3

親愛的可愛的小孩耶穌請淨化你的輸入。 –

+1

我想我每次看到這麼多的sql注入點時都會死在裏面。 – Cyclone

+0

我還沒有了解SQL注入。這還沒有在網絡上,我希望在完成所有工作後防止黑客入侵 – louismoore18

回答

2

更新:

應張貼不註明日期。

繼承人的問題:

mysql_query "INSERT INTO threads (title, message, author, posted);" 
VALUES (NULL,'$_POST[title]','$_POST[message]','$_POST[author]','0','$time'); 

將其更改爲:

mysql_query("INSERT INTO threads (title, message, author, posted) VALUES ('$_POST[title]','$_POST[message]','$_POST[author]','$time');"); 

我看你有沒有空值也,這讓我相信,使用ID有自動遞增的,如果這是這種情況下,你也需要提供這個。例如:

編輯:這裏

mysql_query("INSERT INTO threads (id,title, message, author, posted) VALUES (NULL,'$_POST[title]','$_POST[message]','$_POST[author]','$time');"); 

注直接從POST數據是不安全的,讓你開到各種攻擊插入值。

+0

它需要什麼? – louismoore18

+0

檢查編輯。 – Eddie

+0

剛剛看到..你的代碼帶走了錯誤代碼,但沒有任何東西仍在發佈:/ – louismoore18

0
mysql_query "INSERT INTO threads (title, message, author, dated);" 
VALUES ('$_POST[title]','$_POST[message]','$_POST[author]','$time'); 

您結束了字符串提前。應該是:

mysql_query("INSERT INTO threads (title, message, author, dated) 
    VALUES ('$_POST[title]','$_POST[message]','$_POST[author]','$time')"); 

此外,您的代碼很可能成爲SQL注入的目標。您應該使用MySQLi級別和PreparedStatement插入您的帖子。

+1

你的代碼仍然是錯誤的,太多的價值觀。 – Eddie

+0

Arg,你說得對。糾正了這一點。 –

0

您嘗試添加到新行的值多於指定的值。

mysql_query "INSERT INTO threads (title, message, author, dated);" 

是4個值要設置

VALUES (NULL,'$_POST[title]','$_POST[message]','$_POST[author]','0','$time'); 

,並要指定6個值。

這是不可能

此外驗證$ _POST數據=閱讀本Never trust user input

而且閱讀手冊PHP & MYSQL

0

分號即將結束你的SQL statment。您的查詢未完成。你仍然需要指定你想要插入的值。問題

0

編號:

  1. 如果你把$ _ POST [],你需要把它放在括號{$ _ POST []}或PHP將無法破譯的變量
  2. 下一個名稱的字符串中需要引用$ _POST []中的變量,以便PHP不認爲它們是CONSTANTS,所以它們需要像$ _POST ['title']或$ _POST [「title」]
  3. 其他人有說你需要通過過濾發佈的變量來防止SQL注入。最安全的做法是使用PDO,我在下面列出了一個例子。你可以改善這一點。
  4. 打開錯誤報告,所以你可以看到的錯誤,同時調試

這裏的測試代碼:

ini_set('error_reporting', E_ALL | E_STRICT); 
ini_set('display_errors', 'On'); 
$user='root'; 
$pass=''; 
$dsn = 'mysql:dbname=test;host=localhost'; //for PDO later 

mysql_connect("localhost",$user , $pass); 
mysql_select_db("test");  
$time = time(); 
if (isset($_POST) && !empty($_POST)) 
{ 
// using braces {} 
$sql=<<<SQL 
INSERT INTO threads (title, message, author, posted) 
VALUES ('{$_POST['title']}','{$_POST['message']}','{$_POST['author']}','$time') 

SQL; 

echo "$_POST[title]"."Thread Posted.<br><a href='Untitled9.php'>Return</a>"; 

// now a PDO version of the same 
try { 
    $pdo = new PDO($dsn, $user, $pass); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage();die; 
} 

$sth = $pdo->prepare("INSERT ino threads (title, message, author, posted) 
        VALUES (:title,:message,:author,:posted)"); 
$sth->execute(array(':title' => $_POST['title'],':message' => $_POST['message'], ':author' => $_POST['author'] ,':posted' => $time)); 
echo "Affected rows=".$sth->rowCount().",we are on line=".__LINE__."<br />"; 
echo $_POST['title']." Thread Posted.<br><a href='Untitled9.php'>Return</a>"; 

} // close if $_POST