【问题标题】:PHP PDO fetch form data with while and foreach inside the whilePHP PDO在while内使用while和foreach获取表单数据
【发布时间】:2016-05-16 21:19:26
【问题描述】:

我无法从填充了选择选项的表单更新数据库。 这是我用 MSSQL 数据库中的值填充更新表单的代码:

$result = $pdo->prepare("SELECT d.id as iddr, d.EGN, d.Names, d.NickName, d.Residence, d.PersonalMobilePhone, d.HomeAddress,d.GarantPerson, c.id as cid, c.city_name, c.post_code, t.id, t.IdDriver, t.StartDateVisa, t.EndDateVisa FROM paerp.dbo.Driver d FULL JOIN paerp.dbo.cities c ON d.Residence = c.id FULL JOIN dbo.TrVisas t ON d.id = t.IdDriver WHERE d.id = :id");

$result->bindParam(':id', $id, PDO::PARAM_STR);
$result->execute();
//for($i=0; $row = $result->fetch(); $i++){
     while($row=$result->fetch(PDO::FETCH_ASSOC)){
?>

这是选择选项的地方。这仅显示来自数据库的值。不可能从下拉列表中更改。

 <select id="residence" name="residence">
<option value="<?PHP echo $row['id']; ?>" selected><?PHP echo     $row['city_name']; ?></option>
<?PHP 
$result2 = $pdo->prepare("SELECT id, city_name, post_code FROM cities");
$result2->execute();
 while($row=$result2->fetch(PDO::FETCH_ASSOC)){
?>
    <option value="<?PHP echo $row['id']; ?>"><?PHP echo $row['city_name']; ?></option>     <?php
}
?>  
    </select>

在该选择选项之后我有更多输入,但它们没有填充数据库中的值。一切都停在这个下拉列表中。 同一个人可以帮助我找出正确的方法吗?谢谢! 我尝试用 foreach 代替第二个 while ,但随后表单输入被填充但下拉菜单不起作用。

【问题讨论】:

  • 第一个查询是否预期只有一个结果?如果它返回更多,您将在这里遇到一些冲突 - 首先会有未提取的行可能导致“命令不同步”错误,其次,您对两个提取操作使用相同的变量名称 $row,因此外部 @ 987654326@循环里面会被覆盖。
  • 始终在开发代码时,确保 PHP 显示错误,以便我们可以看到还有什么问题。在代码顶部error_reporting(E_ALL); ini_set('display_errors', 1);。此外,设置您的 PDO 连接以引发异常。 $pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 之前使用它来prepare() 第一个语句。
  • Michael Berkowski,您关于重复名称$row 的建议已修复,我更改了名称,现在可以正常工作了。谢谢你。我如何标记您的回答意见?

标签: php pdo


【解决方案1】:

您正在执行两个查询while fetch 循环,其中一个嵌套在另一个内部。可能还有其他组织逻辑的方法,例如使用fetchAll() 一次从外部查询中检索所有行,然后使用foreach 循环它们。

但这里的主要问题是您在两个 fetch 循环中都使用了变量名 $row。这将导致内部 fetch 覆盖 $row 的先前内容,从而破坏该数组的任何未来预期用途。只需为内部循环使用与 $row 不同的变量名即可。

您可能已经看到 PHP 抱怨未设置的数组索引,这更接近于 $row 的问题。始终在开发和测试代码时,确保 PHP 在屏幕上显示错误。在脚本的顶部,(或在开发工作站上的 php.ini 中启用):

error_reporting(E_ALL);
ini_set('display_errors', 1);

并确保 PDO 抛出有用的异常以帮助调试其行为。默认情况下它会静默出错。

$pdo = new PDO(/* connection details... */);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2015-10-24
    • 2021-09-20
    • 2015-10-13
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多