2012-07-21 130 views
0

我有用戶配置文件更新頁,並有一些形式的更新,在這裏他們將值插入MySQL的

NAME 
SURNAME 
password 
phone 

,我試圖在不做出大的腳本此更新,我的意思是我不想要定義NAME是否存在等等。我希望如果有任何標記的表單值存在它在MySQL中更改。我怎麼知道這是mysqli_prepare語句可能的。我已經寫了這樣的SQL

$stmt = "UPDATE table SET NAME=?,SURNAME=?,PASSWORD=?,PHONE=? WHERE email='" . $email . "'"; 

但是有什麼不對,任何想法如何做到這一點?另外請諮詢爲什麼它是更好的方式來使用mysqli_prepare,爲什麼它也是安全的? PS。我不寫PHP腳本,因爲我已經沒有任何問題,它

UPDATE

我已標記的SQL語句和這個腳本在PHP上面,我是這個書面方式=>

if (isset($_POST['name']){ 
    $name = $_POST['name']; 
} else { 
    $name = null; 
} 

等等...

,但它不執行,沒有什麼錯誤味精顯示了,因爲我覺得有什麼不妥的SQL語句

只需要如果一些細節被填充它更新,如果所有字段都填充所有更新,如何寫腳本?

我不明白在sql語句中的這個問號,這是否意味着如果例如NAME不存在,它會被忽略?

+0

你有什麼嘗試,但沒有工作?您收到的錯誤消息是什麼?請詳細說明 – Ahmad 2012-07-21 09:34:01

+0

mysqli_prepare有助於防止[sql注入] [1]。還有一件事請分享你遇到的錯誤? [1]:http://en.wikipedia.org/wiki/SQL_injection – 2012-07-21 09:35:41

+0

我已更新問題,請參閱:) – tnanoba 2012-07-21 09:41:34

回答

1

SQL字符串中的問號不是SQL語法的一部分,它們是實際參數的佔位符。如果你想這樣做,你應該先做一個SQL語句,然後設置參數。

喜歡的東西

$con = new mysqli($hostname,$username,$password,$database); 
$statement = $con->prepare("UPDATE table SET NAME=?,SURNAME=?,". 
          "`PASSWORD`=?,PHONE=? ". 
          " WHERE email=?"); 
$statement->bind_param("sssss",$name,$surname,$pass,$phone,$email); 

例如衍生的http://www.xphp.info/security/getting-started-with-mysqli/

還要注意ThiefMaster的評論:password是在MySQL中的保留字,所以你需要把它放在反引號(``

或者,您可以直接將值插入到mysql字符串中,就像您最初使用電子郵件地址一樣。 你需要逃避在這種情況下值,通過使用mysql_real_escape_string()

請注意,您在兩種情況下有什麼設置替換所有值,無論是NULL或字符串,或什麼的。

+2

我認爲'PASSWORD'必須包含反引號,它是一個保留關鍵字。 – ThiefMaster 2012-07-21 10:40:59

+0

啊,當然。然後,原始SQL的另一個問題。 – 2012-07-21 10:42:10

+0

爲什麼需要反引號請解釋一下?它能做什麼 ?,謝謝:) – tnanoba 2012-07-21 10:51:09