我正在努力实现这个:
$sql = "INSERT INTO users (location) WHERE social_id='".$_SESSION["FBID"]."' VALUES ('".$_POST["location"]."')";
因此,Location值来自一个表单,但显然需要WHERE,因为它需要进入用户的正确行。 这不起作用,也许有人知道连字符是否错位?
答案 0 :(得分:2)
您不想插入,而是更新记录。您始终插入完整的行 - 而不是现有行的单个列。你使用更新。因此,插入时无需使用。
看看你的问题应该是
UPDATE users SET location = $_POST["location"] where social_id = $_SESSION["FBID"]
正如上面的评论所述,你应该在插入之前至少逃避位置变量。
看看“mysql prepared statements”
答案 1 :(得分: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' ";
答案 2 :(得分:0)
请始终准备您的查询,不要在查询中直接使用$ _POST或任何其他用户输入值来阻止SQL注入。
SQL注入比您想象的更危险
如果你插入$ _POST [" location"] ="'' - "进入@Frank Provost的代码后,您将更新所有行而不是具有FBID会话密钥的行。
使用SQL注入的多个查询
如果您启用了多个查询,则可以插入$ _POST [" location"] ="'' DROP TABLE用户 - "进入@Frank Provost的代码,然后你将 DROP表用户。
始终使用准备好的陈述
您可以在GitHub上查看我的PDO实现示例: 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);