2014-11-02 83 views
0

我已經設置好了所有東西,並且這個工作正常,但是當我點擊提交時,我不能添加'或者任何其他標點符號而沒有得到MySQL語法錯誤。我想知道如何將標點符號添加到我的表單的文本行中。我將它設置爲Collat​​ion下的utf8_unicode_ci,但仍然出現語法錯誤。允許將標點符號提交給MySQL db

textarea是我希望能夠用任何標點或字符提交的地方。這是我的。

這是我使用

print "<form method=post action=reply.php>"; 
print "<h3>Reply:</h3>"; 

print "<br><textarea name=reply_content textarea rows=4 cols=50></textarea>"; 
print "<input type=hidden name=reply_user value={$_SESSION['user_name']}>"; 
print "<input type=hidden name=topic_id value=$id>"; 
print "<br><input type=submit></form>"; 

形式這是SQL的reply.php

$reply_content=$_POST['reply_content']; 
$reply_time=date('Y-m-d H:i:s'); 
$reply_user=$_POST['reply_user']; 
$topic_id=$_POST['topic_id']; 

mysql_query("INSERT INTO reply VALUES ('reply_id', '$reply_user', '$reply_content', '$reply_time', '$topic_id')") OR die(mysql_error()); 

print "<center><h1>Reply Posted Successfully</h1>"; 

我知道有一種方法可以做到這一點,我只是不知道如何。如果有人能幫助我,我會非常感激!

+2

這是一個常見的,很好理解的問題。 SQL語句要求轉義某些字符纔是有效的,並且要避免嚴重的SQL注入漏洞(任何人都可能會篡改數據庫)。從[如何防止SQL注入PHP]開始(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)並開始學習使用PDO而不是' mysql_query()',因爲後者是一箇舊的,現在被棄用的API。沒有新的代碼應該用'mysql _ *()'函數編寫,因爲你只是在學習,所以這是一個很好的學習時間。 – 2014-11-02 22:27:31

+1

本教程[PDO for mysql developers](http://wiki.hashphp .org/PDO_Tutorial_for_MySQL_Developers)是一個很好的資源,它在舊的'mysql _ *()'函數的上下文中構造了PDO並準備了語句。 – 2014-11-02 22:28:40

回答

2

你需要做一些事情,但具體用單引號添加值,等你需要做的是簡單的事:

$reply_content = mysql_real_escape_string($_POST['reply_content']); 

那將採取$_POST['reply_content']並在必要時添加反斜槓,以便將其插入到MySQL中。如果您要將數據顯示回用戶,請不要忘記將其顛倒過來。你不希望他們看到他們不期望的那些斜線。

此外,根據您的例子中,你應該......

  1. 如果你必須使用mysqli_,更換所有的mysql_ *與mysqli_ *函數(mysql_ *功能已被棄用取代他們的mysqli_ *同行)
  2. 消除用戶的任何輸入 - 不要相信他們發送給您的內容。從@邁克爾Berkowski指向 「How can I prevent SQL injection in PHP」 的註釋是一個很好的開始, 「SQL Injection」 是另一個
+0

謝謝,它工作完美。 – sandorfalot 2014-11-02 22:48:15

-1

嘗試使用mysql_real_escape_string

$content = "<form method=post action=reply.php>"; 
$content .= "<h3>Reply:</h3>"; 

$content .= "<br><textarea name=reply_content textarea rows=4 cols=50></textarea>"; 
$content .= "<input type=hidden name=reply_user value={$_SESSION['user_name']}>"; 
$content .= "<input type=hidden name=topic_id value=$id>"; 
$content .= "<br><input type=submit></form>"; 

$content = mysql_real_escape_string($content); 
+0

謝謝,但這沒有奏效。 – sandorfalot 2014-11-02 22:33:52

1

試試這個(見mysql_real_escape_string):

$reply_content = mysql_real_escape_string($_POST['reply_content']);

此外,一些提示對於正確的方法:

您正在將會話中的用戶名寫入隱藏的輸入字段。 嘗試這樣的:

session_start(); 
$reply_user = $_SESSION['user_name']; 

您已經在添加的屬性 '文本區域':

<textarea ... textarea>... 

這樣刪除此

編輯你的HTML輸出:

print "<form method='post' action='reply.php'>"; 
print "<h3>Reply:</h3>"; 

print "<br><textarea name='reply_content' rows='4' cols='50'></textarea>"; 
print "<input type='hidden' name='reply_user' value='{$_SESSION['user_name']}'>"; 
print "<input type='hidden' name='topic_id' value='$id'>"; 
print "<br><input type='submit'></form>"; 

或者這樣:

// Some PHP Stuff 
?> 
<form method="post" action="reply.php"> 
<h3>Reply:</h3> 
<textarea name="reply_content" rows="4" cols="50"></textarea><br/> 
<input type="hidden" name="topic_id" value="<?php echo $id; ?>" /> 
<input type="submit" /> 
</form> 
<?php 
// Go on with php stuff 

甚至還有更多的在這裏做的,但因爲它似乎你是新的PHP中,這應該現在

僅舉這是罰款:你的代碼是不是安全sql injection

+0

謝謝。當我得到這個運行時,我將切換到新的語法並重做我的所有代碼。這只是爲了測試。但是,再次感謝你! – sandorfalot 2014-11-02 22:55:28