PHP PDO使用while和foreach在while中获取表单数据

PHP PDO使用while和foreach在while中获取表单数据,php,pdo,Php,Pdo,从使用select选项填充的表单更新数据库时遇到问题。 这是我用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.IdDriv

从使用select选项填充的表单更新数据库时遇到问题。 这是我用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>

在选择选项之后,我有更多的输入,但它们并没有填充来自数据库的值。一切都停止到这个下拉列表。 sameone能帮我找到正确的方法吗?非常感谢。
我尝试用
foreach
代替第二个
while
,但是表单输入被填充,但下拉菜单不起作用。

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

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

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

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

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

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

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

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

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

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

第一个查询是否只需要一个结果?如果它返回更多,您将在这里遇到一些冲突-首先,将有未蚀刻的行可能导致“命令不同步”错误,其次,您对两个获取操作使用相同的变量名
$row
,因此外部
while
循环将在内部被覆盖。始终在开发代码时,确保PHP显示错误,以便我们可以看到其他失败的地方。在代码顶部
错误报告(E_ALL);ini设置(“显示错误”,1)。另外,设置PDO连接以引发异常<代码>$pdo->setAttribute(pdo::ATTR_ERRMODE,pdo::ERRMODE_异常)
在使用它来准备第一个语句之前。
Michael Berkowski,你关于重复名称的建议
$row
修复了它,我更改了名称,现在可以正常工作了。非常感谢。我如何标记您的回答机会?第一个查询是否预期只有一个结果?如果它返回更多,您将在这里遇到一些冲突-首先,将有未蚀刻的行可能导致“命令不同步”错误,其次,您对两个获取操作使用相同的变量名
$row
,因此外部
while
循环将在内部被覆盖。始终在开发代码时,确保PHP显示错误,以便我们可以看到其他失败的地方。在代码顶部
错误报告(E_ALL);ini设置(“显示错误”,1)。另外,设置PDO连接以引发异常<代码>$pdo->setAttribute(pdo::ATTR_ERRMODE,pdo::ERRMODE_异常)
在使用它来准备第一个语句之前。
Michael Berkowski,你关于重复名称的建议
$row
修复了它,我更改了名称,现在可以正常工作了。非常感谢。我怎样才能给你的回答打分?