php - 更新单个特定 MySQL 单元不起作用

标签 php mysql pdo

我对 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=? 同样的问题

我做错了什么? 提前致谢。

编辑: 似乎我无法在评论中发布图片,所以我做了另一个答案: 这是我的虚拟表,

enter image description here

当我尝试像您的示例一样插入列变量时,表内没有任何反应,但我仍然得到成功响应。

    $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/

相关文章:

MySQL SELECT 查询包含位字段和字符串字段比较 NULL 返回空集

mysql - 在 Laravel 上按标签搜索 AND 和 OR

具有 PDO 的基于 PHP 类的用户系统 - 在非对象上调用成员函数 prepare()

php - 一个查询中的多个 Mysql 更新

php - 如何以编程方式添加商店积分以进行 Magento 订单?

由于警告,带分页的 PHP 搜索代码(使用 php)不会生成导航链接。我该如何纠正错误?

php - fatal error : Uncaught exception 'PDOException' with message

php - preg_match() 期望参数 2 是字符串,数组给定错误

mysql - 无法使用 hibernate 查询从多个表中复制数据并插入到一个表中

php - 具有 PDO 连接的外部文件不起作用