MySQL查询中的会话变量无法使用PHP工作

时间:2016-10-18 18:36:55

标签: php mysql

我有以下MySQL查询:

"UPDATE main SET latitude = '{$_POST['latitude']}', longitude = '{$_POST['longitude']}' WHERE idUser = '".$_SESSION['userId']."'""

但这不起作用,因为userId在查询中始终为null。

但如果我回复$_SESSION['userId'],我会得到32(这就是我想要的)。

如果我将SQL更改为:

"UPDATE main SET latitude = '{$_POST['latitude']}', longitude = '{$_POST['longitude']}' WHERE idUser = 32"

神奇地运作!!!

我做错了什么?

修改

我已将代码更改为使用prepare语句,但仍然无效..

global $conn;
$stmt = $conn->prepare("UPDATE main SET latitude = ?, longitude = ? WHERE idUser = ?");
$stmt->bind_param("ssd", $_POST['latitude'], $_POST['longitude'], $_SESSION['userId']);
$stmt->execute();

只有当我手动编写从$_SESSION['userId']

的回显中获得的用户ID时,它才有效

3 个答案:

答案 0 :(得分:0)

在该字符串.$_SESSION['userId']."'""的末尾有一个额外的双引号,所以即使编译它也不知道。

答案 1 :(得分:0)

您无法使用单个bindParam()命令绑定多个参数(您还使用了错误的函数bind_param())。此外,绑定也用于命名占位符。对于使用未命名占位符的预准备语句,只需使用变量作为数组运行execute(),即:

global $conn;
$stmt = $conn->prepare("UPDATE main SET latitude = ?, longitude = ? WHERE idUser = ?");
$stmt->execute(array($_POST['latitude'], $_POST['longitude'], $_SESSION['userId']));

如果您想使用bindParam(),请使用:

global $conn;
$stmt = $conn->prepare("UPDATE main SET latitude = :lat, longitude = :long WHERE idUser = :userId");
$stmt->bindParam(':lat', $_POST['latitude']);
$stmt->bindParam(':long', $_POST['longitude']);
$stmt->bindParam(':userId', $_SESSION['userId']);
$stmt->execute();

重要说明:您似乎在禁止错误报告,因为使用无效函数bind_param()应该抛出错误。您应该在开发环境中启用错误报告。

答案 2 :(得分:-1)

为什么不以与$ _POST变量相同的方式使用引号?它必须与您在该字符串中使用引号的方式有关。如果我总是在单引号中创建查询字符串,我会发现不那么混乱:

'UPDATE main SET latitude = '". $_POST['latitude'] ."', 
longitude = '". $_POST['longitude'] ."' 
WHERE idUser = '". $_SESSION['userId'];

而且,正如评论所提到的,你应该使用准备好的陈述。