我对PHP / MySQL相当新,但我在网上找不到我的问题的答案:
我有一个包含4个文本字段的表单
<form method="post" action="updateuserdatatest.php">
<input type="text" value="Hans" name="username">
<input type="text" value="1234" name="password">
<input type="text" value="desired cell" name="desiredcell">
<input type="text" value="desired value" name="desiredvalue">
<input type="submit">
</form>
我想用“期望值”更新命名的“所需单元格”。 所以我必须输入用户名,密码,列名(即“streetname”,“postcode”或“city”),然后输入要提交给数据库的字符串值。
我使用此代码:
$pdo = new PDO(everything is OK here! - Checked this out many times);
$sql = 'UPDATE user SET :desiredcell = :desiredvalue WHERE username = :username AND password = :password';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":desiredcell", $_POST['desiredcell'], PDO::PARAM_STR);
$stmt->bindValue(":desiredvalue", $_POST['desiredvalue'], PDO::PARAM_STR);
$stmt->bindValue(":username", $_POST['username'], PDO::PARAM_STR);
$stmt->bindValue(":password", $_POST['password'], PDO::PARAM_STR);
$stmt->execute();
if ($stmt->errno) { echo "FAILURE!!! " . $stmt->error;
}
else echo "Updated {$stmt->affected_rows} rows";
$response = array();
$response['success'] = true;
echo json_encode($response);
?>
这不起作用!
但是当我将sql查询更改为特定的列名时,如'UPDATE user SET streetname = :desiredvalue WHERE username = :username AND password = :password';
然后它的作品!为什么? 我想输入必须手动更新的cellname!
我在使用mysqli查询之前尝试了这个问题UPDATE user SET ?=? WHERE password=? AND username=?
同样的问题
我做错了什么? 提前谢谢。
编辑: 似乎我不能在评论中发布图像,所以我做了另一个答案: 这是我的虚拟表,
当我尝试插入列变量时,就像你的例子一样,表中没有任何反应,但我仍然得到成功的反应。
$column = in_array($_POST['desiredcell'], ['streetname', 'postcode','state']) ? $_POST['desiredcell'] : 'streetname';
$sql = 'UPDATE user SET $column = :desiredvalue WHERE username = :username AND password = :password';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":desiredvalue", $_POST['desiredvalue'], PDO::PARAM_STR);
$stmt->bindValue(":username", $_POST['username'], PDO::PARAM_STR);
$stmt->bindValue(":password", $_POST['password'], PDO::PARAM_STR);
$stmt->execute();
任何提示? = /
编辑: 找到解决方案:
$sql = 'UPDATE user SET '.$column.' = :desiredvalue WHERE username = :username AND password = :password';
谢谢你们。
答案 0 :(得分:1)
正如它提到的评论,你不能绑定列名。您应该使用变量并确保输入是真实的列名称(出于安全原因)
示例:
<?php
$column = in_array($_POST['desiredcell'], ["column1", "column2"]) ? $_POST['desiredcell'] : "column1";
$sql = "UPDATE user SET $column = :desiredvalue WHERE username = :username AND password = :password'";
另外请记住,在数据库中存储纯文本密码是一种真正糟糕的想法。检查password_hash功能。