2016-04-24 62 views
1

我想實現這個:插入柱變到MySQL根據會話變量

$sql = "INSERT INTO users (location) WHERE social_id='".$_SESSION["FBID"]."' VALUES ('".$_POST["location"]."')"; 

所以位置值來自於一種形式,但是,顯然需要在哪裏,因爲它需要進入正確的行爲用戶。 這不起作用,也許有人知道連字符是否放錯了位置?

+1

您確定要插入?你的用戶表只包含一個位置嗎?我想你想要更新嗎?你也不應該直接插入POST變量。首先驗證它不是嘗試從數據庫獲取記錄的一些不良片段。 你也應該把你的位置在聲明的末尾 –

+0

謝謝弗蘭克,就是這樣。是的,我打算在以後檢查,當它工作。 :) – ffritz

+0

開始使用mysqli_prepare語句。 http://php.net/manual/en/mysqli.prepare.php –

回答

2

你應該看看這個: MySQL Insert Where query

你不想插入,但更新記錄。您始終插入一整行 - 而不是現有行的單個列。你使用更新。因此插入時不需要使用何處。

Lookking你的問題應該是這樣的

UPDATE users SET location = $_POST["location"] where social_id = $_SESSION["FBID"] 

如上你應該註釋中,但是插入之前還是逃脫至少位置變量。

看一看「的mysql準備語句」

+0

感謝您的回覆,它的工作原理。什麼是「逃避」? – ffritz

+0

表示在SQL語句中使用字符串中的特殊字符,並考慮連接的當前字符集。閱讀此鏈接http://php.net/manual/en/mysqli.real-escape-string.php –

1

在將其插入數據庫之前,您應該先將字符串轉義以防止MySQL注入。分配給變量會更容易。

此外,我認爲你正在嘗試更新行,使用UPDATE查詢,而不是INSERT。

$FBID = mysqli_real_escape_string($conn, $_SESSION["FBID"]) 
$location = mysqli_real_escape_string($conn, $_POST["location"]) 

$sql = "UPDATE `users` SET `location` = '$location' WHERE `social_id`='$FBID' "; 
+0

感謝你,我實際上將變量傳遞給另一個文件中的函數。那麼逃生應該在功能上完成嗎?或者在調用函數的ifset中? – ffritz

+0

@FelixF。別客氣!兩者都很好,雖然在將它傳遞到函數之前轉義它會更容易。 – Panda

0

請隨時準備好您的查詢,從來沒有使用$ _ POST或任何其它用戶輸入值直接在您的查詢,以防止SQL注入。

SQL注入是比較危險的,那麼你認爲

如果您插入$ _ POST [「所在地」] =「‘’ - 」到@Frank教務長的代碼,那麼你將UPDATE所有行而不是使用FBID會話密鑰的那個。

與SQL注入多個查詢

如果已經啓用了多查詢,則可以插入$ _ POST [「所在地」] =「‘’; DROP TABLE用戶 - 」到@Frank教務長的代碼,然後您將刪除表用戶

始終使用準備好的語句

你可以看看我的PDO實現的例子在GitHub上: https://github.com/maartensch/database-pdo-mysql-class-php

示例代碼:

$sql = "INSERT INTO yourTablename(id,name) VALUES(:id,:name)"; 
$userInputId = 'yourUnescapedValue'; 
$userInputName = 'yourUnescapedValue'; 
$preparedStatements = array(':id'=>$userInputId,':name'=>$userInputName); 
Db::getDb()->query($sql,$preparedStatements);