2016-05-16 34 views
1

我无法从填充选择选项的表单更新数据库。 这是我的代码与来自MSSQL数据库值来填充更新形式:PHP PDO获取表单数据while while foreach while

$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,但表单输入已填充,但下拉不起作用。

+0

第一个查询是否只有一个结果?如果它返回更多,你将在这里产生一些冲突 - 首先会有未被取出的行可能导致“命令不同步”错误,其次,你使用相同的变量名'$ row'来执行这两个取动作, 'while循环会被覆盖在里面。 –

+0

总是在开发代码时,确保PHP显示错误,以便我们可以看到还有哪些失败。在你的代码的最上面'error_reporting(E_ALL); ini_set('display_errors',1);'。另外,设置您的PDO连接以抛出异常。 '$ pdo-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);'在使用它来准备()'第一条语句之前。 –

+1

Michael Berkowski,你对重复名称'$ row'的建议修正了它,我改了名字,现在工作正常。谢谢。我怎么能标记你的oppinion的答案? – Nasko

回答

0

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

但是,这里的主要问题是在两个提取循环中使用变量名$row。这将导致内部提取覆盖$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);