2016-05-16 5 views
1

selectオプションを指定してフォームからデータベースを更新する際に問題があります。 これは、MSSQLデータベースからの値で更新フォームを埋めるために私のコードです:whileとforeachを使用してPHP PDOがフォームデータをフェッチする

$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> 

この選択オプションの後に入力が増えましたが、データベースから値が入力されません。すべてがこのドロップダウンに止まります。 同じ方法で正しいことを理解できますか?ありがとうございました! whileの代わりにforeachを試してみましたが、フォームの入力は行われますが、ドロップダウンは機能しません。

+0

正確に1つの結果が期待されますか?より多くを返すと、いくつかのコンフリクトが発生します。まず最初に、 "コマンドが同期していない"というエラーを引き起こす可能性のある行が残っていて、次に両方のフェッチアクションに同じ変数名 '$ row'を使用すると、 'while'ループは内部で上書きされます。 –

+0

常にコードを開発するときに、PHPがエラーを表示していることを確認して、何が失敗しているのかを確認してください。あなたのコードの先頭に 'error_reporting(E_ALL); ini_set( 'display_errors'、1); '。また、例外をスローするようにPDO接続を設定します。最初の文を 'prepare()'する前に '$ pdo-> setAttribute(PDO :: ATTR_ERRMODE、PDO :: ERRMODE_EXCEPTION); –

+1

Michael Berkowski、重複する名前 '$ row'に関するあなたの提案はそれを修正しました。私は名前を変更して正常に動作します。ありがとうございました。あなたの意見を答えとしてどうやってマークできますか? – Nasko

答えて

0

whileフェッチループを2つ実行し、別のフェッチループ内に入れ子にします。 fetchAll()を使用して外部クエリからすべての行を一度に取得し、次にforeachを使用してそれらをループするなど、ロジックを整理する他の方法があります。

しかし、ここでの主な問題は、両方のフェッチループで変数名$rowを使用することです。これにより、インナーフェッチが前の内容である$rowを上書きし、その配列の今後の使用を破棄します。内側ループに$row以外の変数名を使用するだけで便利です。

$rowの問題をより詳細に指摘していた配列のインデックスが設定されていないと、PHPが不満を表明しているかもしれません。常にコードを開発してテストするときは、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); 
関連する問題