我在这里完全失败了。我编写了一个相对简单的PHP脚本,它根据HTML表单中的用户输入更新数据库记录。该脚本包含一个基于隐藏输入执行的“if”语句。我知道该语句执行是因为SQL查询执行没有问题。我遇到的问题是,如果设置了查询对象,那么还有另一个if语句应该执行,但显然它不会因为$ message变量没有赋值。我知道查询对象已设置,因为当我回显它时,它显示为'1'。以下是有问题的代码块:
<?php
if(isset($_POST['submitted']) == 1) {
$name = mysqli_real_escape_string($dbc, $_POST['name']);
$q = "UPDATE ".$_POST['table']." SET name = '".$name."' WHERE id = ".$_POST['id'];
$r = mysqli_query($dbc, $q);
echo $r;
print_r($_POST);
echo mysqli_error($dbc);
if ($r) {
$message = '<p>Operation executed successfuly</p>';
} else {
$message = '<p>Operation did not execute because: '.mysqli_error($dbc);
$message .= '<p>'.$q.'</p>';
}
}
?>
查询下面的回声和print_r()用于调试目的。应该回显$ message的代码高于前面提到的代码块(在我的脚本中),如下所示:
<?php if(isset($message)) {echo $message;} ?>
此外,我尝试将isset()用于$ r变量,并将条件更改为$r !== false
,但这没有任何区别。当我在没有isset()的情况下回显$ message时,我得到了明显的“未定义的变量:第47行的C:\ xampp \ htdocs \ IMS \ modify.php中的消息”错误。如果我错过了一些明显的东西,我表示歉意。我事先进行了搜索,但所有的答案都与我的情况有太大不同,如果你知道我的意思,我对PHP的了解太小,无法连接那些遥远的点。
<?php
error_reporting(E_ALL);
include('config/setup.php');
$id = $_GET['id'];
$table = $_GET['table'];
if ($table == "users") {
header('Location: index.php');
exit;
}
?>
<html>
<head>
<title>Update</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<div class="back">
<a href="category_list.php">Back</a>
</div>
<div class="panel">
<?php
if(!isset($_POST['submitted'])) {
$q = "SELECT name FROM $table WHERE id = $id";
$r = mysqli_query($dbc, $q);
$row = mysqli_fetch_assoc($r);
if($table == "categories"){
$type = "category";
} else if ($table == "products") {
$type = "product";
}
echo "<p>You are changing the properties of this ".$type.": ".$row['name']."</p>";
}
?>
<?php if(isset($message)) {echo $message;} ?>
<form action="modify.php" method="POST">
<label for="name">New name</label>
<input type="text" class="form-control" id="name" name="name">
<button type="submit">Submit</button>
<input type="hidden" name="submitted" value="1">
<input type="hidden" name="id" value="<?php echo $id; ?>">
<input type="hidden" name="table" value="<?php echo $table; ?>">
</form>
<?php
if(isset($_POST['submitted'])) {
$name = mysqli_real_escape_string($dbc, $_POST['name']);
$q = "UPDATE ".$_POST['table']." SET name = '".$name."' WHERE id = ".$_POST['id'];
$r = mysqli_query($dbc, $q);
echo $r;
print_r($_POST);
echo mysqli_error($dbc);
if ($r !== false) {
$message = '<p>Operation executed successfuly</p>';
} else {
$message = '<p>Operation did not execute because: '.mysqli_error($dbc);
$message .= '<p>'.$q.'</p>';
}
}
?>
</div>
</body>
EDIT2:好吧,我想出了一个解决问题的“修复”,即我在$ message的回显之前移动if条件并将条件更改为isset($_POST['submitted']
。我想这必须这样做。我想我应该阅读更多关于处理提交数据和解析PHP文件的操作顺序,因为我很困惑为什么这个“修复”甚至可以工作......
答案 0 :(得分:2)
这(条件)陈述是误报:
if(isset($_POST['submitted']) && $_POST['submitted']== 1)
您需要做的是将它们分成两个单独的陈述:
==1
或只删除$q = "UPDATE :table SET :name = :name WHERE id = :id;
。
您的代码也可以使用严格的SQL注入。从用户输入更新表和设置列根本不安全。
充其量,请使用准备好的声明。
但是,请注意,如果要将表和/或列转换为预准备语句方法,则无法绑定它。
因此,以下将失败(使用PDO预处理语句作为示例):
$q = "UPDATE ? SET name = :name WHERE id = :id;
或
{{1}}
请阅读以下有关此方法的内容,但不能使用该方法: