我有以下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']
答案 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'];
而且,正如评论所提到的,你应该使用准备好的陈述。