Mywhere的“ where子句”中的未知列“ $ id”

时间:2019-03-23 11:28:39

标签: php mysql mysqli

当我试图运行一些sql代码时,我实际上得到了这些错误,并且由于代码看起来很干净而感到非常困惑(我的意思是没有错误)

实际上是在最新的PHP 7.3.1上运行这些程序

<input type="text" name="username" placeholder="username"><br><br>
<input type="text" name="first_name" placeholder="first name"><br><br>
<input type="text" name="last_name" placeholder="last name"><br><br>
<input type="email" name="email" placeholder="email"><br><br>
<input type="password" name="password" placeholder="password"><br><br>
<select name="id" id="">
    <?php

        while ($row = mysqli_fetch_assoc($result)) {

            $id = $row['id'];

            echo '<option value="$id">'.$id.'</option>';
        }

    ?>

</select><br><br>
<input type="submit" value="update" name="submit">

$username   = $_POST['username'];
$first_name = $_POST['first_name'];
$last_name  = $_POST['last_name'];
$email      = $_POST['email'];
$password   = $_POST['password'];
$id     = $_POST['id'];


$query_update  = "UPDATE users SET ";
$query_update .= "username = '$username', ";
$query_update .= "first_name = '$first_name', ";
$query_update .= "last_name = '$last_name', ";
$query_update .= "email = '$email', ";
$query_update .= "password = '$password' ";
$query_update .= "WHERE id =$id";

$result_update = mysqli_query($conn, $query_update);

if ($result_update) {
    echo 'Record Update Successfully <br><br>';
} else {
    die('Error'. mysqli_error($conn) .'<br><br>');
}

我想我希望输出能够成功,但是它给我“ where子句”中的未知列“ $ id”

2 个答案:

答案 0 :(得分:1)

echo '<option value="$id">'.$id.'</option>';

在生成HTML时,您使用的是单引号字符串。在PHP中,变量不会插入单引号字符串中,因此当您以后从$_POST中读取值时,该值实际上是 $ id

这就是为什么您必须中断字符串以使$id变量清晰可见的原因。首次使用字符串中的变量时,您需要做同样的事情。

(或交换到另一种方法,例如使用插入 的双引号字符串)。


虽然您的ID很可能是系统生成的数字,而不是用户输入的数字,但是在获取任何未明确显示的数据时,应始终使用standard measures来防止XSS attacks 安全HTML 并将其插入HTML文档中。


请注意,您的SQL非常容易受到SQL注入攻击的攻击。您应该切换为使用prepared statements with bound arguments


The HTML placeholder attribute is not a substitute for the label element

答案 1 :(得分:0)

我认为问题出在您的选项标签上。
echo '<option value="$id">'.$id.'</option>';

您的选项的值将为“ $ id”字符串,因为您在回显中使用了单引号。

将其更改为

echo '<option value="{$id}">'.$id.'</option>';

或者您可以使用适当的Php串联以获得更易读的代码

echo '<option value="' . $id . '">' . $id . '</option>';

然后可以转储查询以检查查询是否正确,然后转储结果以进行正确的调试。

相关问题