具有预准备语句的简单PHP选择不显示结果

tau*_*rus 1 php mysql sql

我正在尝试创建一个简单的PHP脚本,该脚本使用准备好的语句选择数据。当前,我正在使用教程作为源。当我调用脚本时,error.log中没有错误,但是没有数据显示。这是我的脚本:

<?php
$servername = "xxx";
$username = "xxx";
$password = "xxx";
$dbname = "xxx";  

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$stmt = $conn->prepare("SELECT * FROM Regions WHERE id=?");
$stmt->bind_param("i", $_POST['id']);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows > 0) {
  while($row = $result->fetch_assoc()) {
    $name[] = $row['name'];
    $center[] = $row['center'];
    $content_string[] = $row['content_string'];

  }
}
$stmt->close();
echo $name;
echo $center;
echo $content_string;

$conn->close();
?>
Run Code Online (Sandbox Code Playgroud)

我的结构如下所示:

在此处输入图片说明

我试图通过调用http://URL/php/protected.php?id = 1http://URL/php/protected.php来访问输出, 但无济于事。我缩小了错误发生的范围,因为if($result->num_rows > 0)从未进行评估。由此,我认为该错误必须在我的SQL语句中。

D-M*_*arc 5

我实际上是该教程的作者。您是否检查了有关错误处理的部分?通过遵循该步骤,您应该能够获得有意义的消息。

例如

if ( !$stmt = $conn->prepare("SELECT * FROM Regions WHERE id=?") ) 
 echo "Prepare Error: ($conn->errno) $conn->error";
if ( !$stmt->bind_param("i", $_POST['id']) )
  echo "Binding Parameter Error: ($conn->errno) $conn->error";
if ( !$stmt->execute() ) 
 echo "Execute Error: ($stmt->errno)  $stmt->error";
if ( !$stmt->get_result() ) //Only for select with get_result()
 echo "Getting Result Error: ($conn->errno) $conn->error";
if ( !$stmt->store_result() ) //Only for select with bind_result()
 echo "Storing Result Error: ($conn->errno) $conn->error";
$stmt->close();
Run Code Online (Sandbox Code Playgroud)

编辑:一种更优雅的方法是使用异常处理。请记住,如果创建连接之前mysqli_report()使用它,则它将在出现错误时输出您的数据库密码。无论如何,您应该使用a 或自定义异常处理程序打印到错误日志,但这是值得指出的。另外,请确保这样做并在您的php.ini中try/catchdisplay_errors = Offlog_errors = On

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$stmt = $conn->prepare("SELECT * FROM Regions WHERE id=?");
$stmt->bind_param("i", $_POST['id']);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows > 0) {
  while($row = $result->fetch_assoc()) {
    $name[] = $row['name'];
    $center[] = $row['center'];
    $content_string[] = $row['content_string'];

  }
}
$stmt->close();
Run Code Online (Sandbox Code Playgroud)

但是正如RichGoldMd指出的那样,您还应该执行以下操作,这是导致我的经验出错的非常普遍的原因。

$id = (!empty($_POST['id']) ? $_POST['id'] : '');
Run Code Online (Sandbox Code Playgroud)