当我试图运行一些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”
答案 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>';
然后可以转储查询以检查查询是否正确,然后转储结果以进行正确的调试。