[英]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.