2016-05-16 37 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);