2016-04-24 60 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);