簡體   English   中英

即使條件為真,if語句也不會執行

[英]If statement doesn't execute even though condition is true

我在這里完全不知所措。 我編寫了一個相對簡單的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;} ?>

另外,我嘗試對$ r變量使用isset(),並將條件更改為$r !== false但這沒什么區別。 當我只回顯$ message而沒有isset()時,我得到了明顯的“未定義變量:C:\\ xampp \\ htdocs \\ IMS \\ modify.php在第47行的消息”錯誤。 如果我錯過了顯而易見的事情,我深表歉意。 我事先進行了搜索,但是所有答案都與我的情況有所不同,而且我對PHP的了解太小,以至於我無法連接那么遠的點(如果您知道我的意思)。

編輯:好的,我不妨放在整個腳本中。 抱歉,到處都是。 按下提交按鈕后,$ id和$ table變量確實顯示為未定義,這與它有關系嗎?

<?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文件時閱讀更多有關操作順序的信息,因為我對為什么這個“修復”甚至可以正常工作感到困惑...

這(條件)語句是假陽性:

if(isset($_POST['submitted']) == 1)

您需要做的就是將它們分解成兩個單獨的語句:

if(isset($_POST['submitted']) && $_POST['submitted']== 1)

或只是刪除==1

您的代碼也可以進行嚴重的SQL注入。 從用戶輸入更新表和設置列根本不安全。

充其量,請使用准備好的語句。

但是,請注意,你不能綁定表和/或列如果您想將其轉換成一個准備好的聲明方法。

因此,以下操作將失敗(以PDO准備好的語句為例):

$q = "UPDATE :table SET :name = :name WHERE id = :id;

要么

$q = "UPDATE ? SET name = :name WHERE id = :id;

請閱讀以下有關此方法的內容,該方法無法使用:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM