更新单个特定的MySQL Cell无法正常工作

时间:2017-09-08 08:08:19

标签: 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>

我想用“期望值”更新命名的“所需单元格”。 所以我必须输入用户名,密码,列名(即“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=?同样的问题

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

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

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';
谢谢你们。

1 个答案:

答案 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功能。