如果条件为真,则语句不执行

时间:2017-09-28 12:57:25

标签: php

我在这里完全失败了。我编写了一个相对简单的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的了解太小,无法连接那些遥远的点。

编辑:好吧,我不妨放入整个剧本。我的道歉,它有点遍布各处。按下提交按钮后,$ id和$ table变量显示为undefined,这可能与它有关吗?

<?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文件的操作顺序,因为我很困惑为什么这个“修复”甚至可以工作......

1 个答案:

答案 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}}

请阅读以下有关此方法的内容,但不能使用该方法: