[PDO查询将返回空白记录,不应该返回任何记录

问题描述 投票:0回答:1

加载HTML页面时,我也进行数据库查询以填充多个'select'下拉列表。我发现有1个查询返回了23个空白记录(至少这是它看起来要执行的操作),并向下拉列表中添加了23个空白“选项”。由于此查询(#2)的表尚不存在,我希望查询不返回任何记录,并且下拉列表中也不会添加任何记录。 23条记录恰好与查询#1返回的记录数相同。除了有关列名的无效索引消息(其中有2个)之外,PHP错误日志中未报告任何错误。

许多年前,当我学习PHP时,我写了Database类。我已经查看了类代码,但没有发现任何错误。我在页面顶部创建数据库对象,并将该1个对象用于所有查询。

我已经发布了查询和所有使用的类函数。由于我看不到问题,所以希望有人可以。

感谢您提供任何帮助,

查尔斯

查询1,按预期方式工作:

<div class="container" title="Please select your name suffix.">
 <label for="suffix">Suffix:</label><br>
 <select id="suffix" name="suffix" onchange="">
  <option value="0"<?php if(isset($_POST["suffix"]) && (($_POST["suffix"] == "0") || ($_POST["suffix"] == "1"))) echo(' selected="selected"');?>>&nbsp;</option>
  <option value="1"><?php echo("S" == "P" ? "Add New/Edit Prefix" : "Add New/Edit Suffix");?></option>
<?php
$sql = "SELECT `id`, `abbrev`, `description` FROM `{$pdo->db_name}`.`name_pre-suf` WHERE `type` = :type ORDER BY `abbrev` ASC;";
$pdo->query($sql);
$pdo->bind(":type", str_ToUpper("S"));
$results = $pdo->resultSet();
if($pdo->rowCount())
{
 foreach($results as $row)
 {
  echo("      <option value=\"" . SafeDisplay($row["id"]) . "\"");
  if(isset($_POST["suffix"]))
  {
   if(SafeDisplay($row["id"]) == SafeDisplay($_POST["suffix"]))
   {
    echo(" selected=\"selected\"");
   } // Closing brace for if(SafeDisplay($row["id"]) == SafeDisplay($_POST["suffix"]))
  } // Closing brace for if(isset($_POST["suffix"]))
  echo(">" . SafeDisplay($row["abbrev"]) . " - " . SafeDisplay($row["description"]) . "</option>" . PHP_EOL);
 } // Closing brace for foreach($results as $row)
} // Closing brace for if($pdo->rowCount())
?>
 </select>
 <span id="cefiform_suffix_errorloc" class="error"><?php if(isset($validator) && array_key_exists('suffix', $validator->errors)) echo(implode('<br>', $validator->errors['suffix']));?></span>
</div>

查询2,不应使用,因为表'countries'还不存在。我希望没有添加任何记录。但是,返回了23条记录,并添加了23个空白“选项”。查询1记录的记录数恰好是23。

<div class="container" title="Please select your country.">
 <label for="ctry">Country:</label><br>
 <select id="ctry" name="ctry">
  <option value="0"<?php if(isset($_POST["ctry"]) && (($_POST["ctry"] == "0") || ($_POST["ctry"] == "1"))) echo(' selected="selected"');?>>&nbsp;</option>
  <option value="1">Add New/Edit Country</option>
<?php
$sql = "SELECT `alpha2_id`, `common_name` FROM `{$pdo->db_name}`.`countries` ORDER BY `common_name` ASC;";
$pdo->query($sql);
$results = $pdo->resultSet();
if($pdo->rowCount())
{
 foreach($results as $row)
 {
  echo("      <option value=\"" . SafeDisplay($row["alpha2_id"]) . "\"");
  if(isset($_POST["ctry"]))
  {
   if(SafeDisplay($row["alpha2_id"]) == SafeDisplay($_POST["ctry"]))
   {
    echo(" selected=\"selected\"");
   } // Closing brace for if(SafeDisplay($row["alpha2_id"]) == SafeDisplay($_POST['ctry']))
  } // Closing brace for if(isset($_POST['ctry']))
  echo(">" . SafeDisplay($row["common_name"]) . "</option>" . PHP_EOL);
 } // Closing brace for foreach($results as $row)
} // Closing brace for if($pdo->rowCount())
?>
 </select>
 <span id="cefiform_ctry_errorloc" class="error"><?php if(isset($validator) && array_key_exists('ctry', $validator->errors)) echo(implode('<br>', $validator->errors['ctry']));?></span>
</div>

class Database
{
 // Set database handler and database name variables
 private $pdo;
 public $db_name;

 // Set errors variable
 public $errors = array();

 public function bind($param, $value = null, $type = null)
 {
  if(is_array($param) && is_null($value) && is_null($type))
  {
   foreach($param as $key => $value)
   {
    $this->bind($key, $value);
   } // Closing brace for foreach($param as $key => $value)
  } // Closing brace for if(is_array($param) && is_null($value) && is_null($type))
  else
  {
   if(is_null($type))
   {
    switch(true)
    {
     case is_int($value):
      $type = PDO::PARAM_INT;
      break;
     case is_bool($value):
      $type = PDO::PARAM_BOOL;
      break;
     case is_null($value):
      $type = PDO::PARAM_NULL;
      break;
     default:
      $type = PDO::PARAM_STR;
      break;
    }
   }
   $this->stmt->bindValue($param, $value, $type);
  } // Closing brace for if(is_array($param) && is_null($value) && is_null($type)) else
 }

 public function query($query)
 {
  try
  {
   $this->stmt = $this->pdo->prepare($query);
  }
  catch(PDOException $e)
  {
   $this->addError("pdo", $e->getMessage());
  }
 }

 public function resultSet()
 {
  $this->execute();
  return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
 }

 public function rowCount()
 {
  return $this->stmt->rowCount();
 }
}
php database pdo
1个回答
0
投票

如果对Database的调用失败,则您的$this->stmt类需要清除prepare()

 public function query($query)
 {
  try
  {
   $this->stmt = $this->pdo->prepare($query);
  }
  catch(PDOException $e)
  {
   $this->addError("pdo", $e->getMessage());
   $this->stmt = null;
  }

以及所有其他使用$this->stmt的方法都需要先检查它是否为null。例如:

 public function resultSet()
 {
  if (!$this->stmt) {
    return [];
  }
  $this->execute();
  return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
 }
© www.soinside.com 2019 - 2024. All rights reserved.