我对 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>
我想用“所需值”更新命名的“所需单元格”。 所以我必须输入用户名、密码、列名(即“街道名称”、“邮政编码”或“城市”),然后输入要提交到数据库的字符串值。
我使用此代码:
$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';
然后就可以了!为什么? 我想输入必须手动更新的单元名称!
我之前用mysqli查询尝试过这个,比如UPDATE user SET ?=?密码在哪里=? 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';
谢谢大家。
最佳答案
正如注释中提到的,您无法绑定(bind)列名称。您应该使用变量并确保输入是真实的列名称(出于安全原因)
示例:
<?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功能。
关于php - 更新单个特定 MySQL 单元不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46111639/