加载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"');?>> </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"');?>> </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();
}
}
如果对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);
}