2013-10-02 2 views
1

У меня есть база данных «Telefoon» со столом «Telefoonnummers». В таблице есть столбцы «naam», «number» и «mobiel»Обновление записи базы данных с помощью PHP/PDO и mySQL

Я пытаюсь создать страницу .php, где я могу обновить запись. Я уверен, что это правильно, но почему-то ничего не меняется.

Здесь вы заполняете обновленные записи, и когда вы нажимаете кнопку, она переходит на следующую страницу, которая обновляет его.

<!DOCTYPE HMTL> 
<html> 

<head> 
    <title>Wijzigen telefoonnummer</title> 
</head> 

<body> 

    <?php 

     $record_name = $_GET["naam"]; 

     $user = "root"; 
     $pass = "root"; 

     $dbh = new PDO(
      'mysql:host=localhost; port=8473; dbname=telefoon', 
      $user, 
      $pass 
     ); 

     $sth = $dbh -> prepare(" 

      SELECT * 
      FROM Telefoonnummers 
      WHERE naam = :record_name 

     "); 

     $sth -> bindValue(":record_name", $record_name, PDO::PARAM_STR); 

     $sth -> execute(); 

     $printRecord = $sth -> fetchAll(PDO::FETCH_ASSOC); 

     /* 
     //dit record als array weergeven 
     print("<pre>"); 
     print_r($printRecord); 
     print("</pre>"); 
     */ 

     //gegevens in variabelen zetten 
     $printRecordRecord = $printRecord[0]; 
     $huidigeNaam = $printRecordRecord["naam"]; 
     $huidigeNummer = $printRecordRecord["telefoonnummer"]; 
     $huidigeMobiel = $printRecordRecord["mobiel"]; 

     //niet meer nodig door bovenstaande 
     /* 
     foreach($printRecord AS $printRecordIndex => $printRecordRecord) { 

      $huidigeNaam = $printRecordRecord["naam"]; 
      $huidigeNummer = $printRecordRecord["telefoonnummer"]; 
      $huidigeMobiel = $printRecordRecord["mobiel"]; 

     } 
     */ 

     print(" 

      <form action='wijzig.php' method='POST'> 
       <table> 

        <tr> 
         <td bgcolor='green'><b>Naam</b></td> 
         <td bgcolor='green'><b>Telefoonnummer</b></td> 
         <td bgcolor='green'><b>Mobiel</b></td> 
         <td bgcolor='green'></td> 
        </tr> 

        <tr> 
         <td><input type='text' name='naam' value='$huidigeNaam' disabled='TRUE' /></td> 
         <td><input type='text' name='nummer' value='$huidigeNummer' /></td> 
         <td><input type='text' name='mobiel' value='$huidigeMobiel' /></td> 
         <td><input type='submit' value='Wijzig' /></td> 
        </tr> 

       </table> 
      </form> 

     "); 

    ?> 

</body> 

Это следующая страница, которая на самом деле изменения (по крайней мере, это то, что я хочу) запись:

<!DOCTYPE HTML> 
<html> 

<head> 
    <title>Gewijzigd</title> 
</head> 

<body> 

    <?php 

     //geupdate gegevens ophalen 
     $newNaam = $_POST["naam"]; 
     $newNumber = $_POST["nummer"]; 
     $newMobile = $_POST["mobiel"]; 

     //gegevens updaten als ALLES is ingevuld 
     if (($newNaam != "") && ($newNumber != "") && ($newMobile != "")) { 

      $user = "root"; 
      $pass = "root"; 

      $dhb = new PDO(
       'mysql:host=localhost; port=8473; dbname=telefoon', 
       $user, 
       $pass 
      ); 

      $sth = $dbh -> prepare(" 

       UPDATE Telefoonnummers 
       SET naam = :naam, 
       telefoonnummer = :nummer, 
       mobiel = :mobiel 
       WHERE naam = :naam 

      "); 

      $sth -> bindValue(":naam", $newNaam, PDO::PARAM_STR); 
      $sth -> bindValue(":telefoonnummer", $newNumber, PDO::PARAM_STR); 
      $sth -> bindValue(":mobiel", $newMobile, PDO::PARAM_STR); 

      $sth -> execute(); 

      $sthCheck = $dbh -> prepare(" 

       SELECT * 
       FROM Telefoonnummers 
       WHERE naam = :naam 

      "); 

      $sthCheck -> bindValue(":naam", $newNaam, PDO::PARAM_STR); 

      $sthCheck -> execute(); 

     } 

    ?> 

</body> 

Что не так с этим?

+0

Есть опечатка, $ dhb! = $ Dbh. Кроме этого, убедитесь, что он входит в строку if и завершает весь ваш код PDO в блоке try/catch, чтобы проверить наличие ошибок. – aynber

+0

Ах, опечатка теперь удалена! Но тем не менее, это ничего не меняет в db. Я уверен, что это входит в инструкцию if(). Я получил ту же строку в другом файле, и там она работает нормально. Но этот файл _adds_ записывает, а не меняет его. – JeroenJK

+0

Кроме того, в Coda 2, когда я просматриваю файлы .php, они получили такую ​​ошибку: ----- Предупреждение: PDO :: __ construct(): [2002] Нет такого файла или каталога (попытка подключения через unix: ///var/mysql/mysql.sock) in-on line 21 Неустранимая ошибка: исключить исключение «PDOException» с сообщением «SQLSTATE [HY000] [2002] Нет такого файла или каталога 'in -: 21 Stack trace: # 0 - (21): PDO -> __ construct ('mysql: host = loca ...', 'root', 'root') # 1 {main} throw in - on line 21 -----, но последний файл является единственным, кто этого не делает. – JeroenJK

ответ

1

Я создал быстрые тестовые страницы, используя ваш код. Я нашел две вещи, которые не работали правильно.

  1. Начальная форма - Поле «НА» был отключено в форме. Это означает, что параметр не попадает на страницу Wijzig.php. Поскольку «naam» всегда будет нулевым и, таким образом, равен «» - это не пропустит его после вашего заявления if. Чтобы это сработало, я снова включил поле «naam» в первом виде.
  2. Параметр в инструкции UPDATE - В вашем заявлении UPDATE он попытался получить доступ к параметру с именем «: telefoonnummer» еще в параметрах, использовался «: nummer». Это приведет к тому, что PDO выдаст исключение при выполнении.

Quick Note - добавил я эхо заявление wijzig.php так, что успешный запуск будет производить видимый результат какой-то.

При том, что я обновил два файла, чтобы быть, как, например:

index.php

<head> 
<title>Wijzigen telefoonnummer</title> 
</head> 

<body> 

<?php 

    $record_name = $_GET["naam"]; 

    $user = "root"; 
    $pass = "root"; 

    $dbh = new PDO(
     'mysql:host=localhost; port=8473; dbname=telefoon', 
     $user, 
     $pass 
    ); 

    echo $record_name; 

    $sth = $dbh -> prepare(" 

     SELECT * 
     FROM Telefoonnummers 
     WHERE naam = :record_name 

    "); 

    $sth -> bindValue(":record_name", $record_name, PDO::PARAM_STR); 

    $sth -> execute(); 

    $printRecord = $sth -> fetchAll(PDO::FETCH_ASSOC); 

    /* 
    //dit record als array weergeven 
    print("<pre>"); 
    print_r($printRecord); 
    print("</pre>"); 
    */ 

    //gegevens in variabelen zetten 
    $printRecordRecord = $printRecord[0]; 
    $huidigeNaam = $printRecordRecord["naam"]; 
    $huidigeNummer = $printRecordRecord["telefoonnummer"]; 
    $huidigeMobiel = $printRecordRecord["mobiel"]; 

    //niet meer nodig door bovenstaande 
    /* 
    foreach($printRecord AS $printRecordIndex => $printRecordRecord) { 

     $huidigeNaam = $printRecordRecord["naam"]; 
     $huidigeNummer = $printRecordRecord["telefoonnummer"]; 
     $huidigeMobiel = $printRecordRecord["mobiel"]; 

    } 
    */ 

    print(" 

     <form action='wijzig.php' method='POST'> 
      <table> 

       <tr> 
        <td bgcolor='green'><b>Naam</b></td> 
        <td bgcolor='green'><b>Telefoonnummer</b></td> 
        <td bgcolor='green'><b>Mobiel</b></td> 
        <td bgcolor='green'></td> 
       </tr> 

       <tr> 
        <td><input type='text' name='naam' value='$huidigeNaam'/></td> 
        <td><input type='text' name='nummer' value='$huidigeNummer' /></td> 
        <td><input type='text' name='mobiel' value='$huidigeMobiel' /></td> 
        <td><input type='submit' value='Wijzig' /></td> 
       </tr> 

      </table> 
     </form> 

    "); 

?> 

</body> 

wijzig.php

<head> 
<title>Gewijzigd</title> 
</head> 

<body> 

<?php 

    //geupdate gegevens ophalen 
    $newNaam = $_POST["naam"]; 
    $newNumber = $_POST["nummer"]; 
    $newMobile = $_POST["mobiel"]; 

    //gegevens updaten als ALLES is ingevuld 
    if (($newNaam != "") && ($newNumber != "") && ($newMobile != "")) { 

     $user = "root"; 
     $pass = "root"; 

     $dbh = new PDO(
     'mysql:host=localhost; port=8473; dbname=telefoon', 
     $user, 
     $pass 
    ); 

     $sth = $dbh -> prepare(" 

      UPDATE Telefoonnummers 
      SET naam = :naam, 
      telefoonnummer = :nummer, 
      mobiel = :mobiel 
      WHERE naam = :naam 

     "); 

     $sth -> bindValue(":naam", $newNaam, PDO::PARAM_STR); 
     $sth -> bindValue(":nummer", $newNumber, PDO::PARAM_STR); 
     $sth -> bindValue(":mobiel", $newMobile, PDO::PARAM_STR); 

     $sth -> execute(); 

     $sthCheck = $dbh -> prepare(" 

      SELECT * 
      FROM Telefoonnummers 
      WHERE naam = :naam 

     "); 

     $sthCheck -> bindValue(":naam", $newNaam, PDO::PARAM_STR); 

     echo "Number of records changed: ".$sthCheck -> execute(); 

    } 

?> 

</body> 

При запуске против существующей записи, то производит следующие данные:

Number of records changed: 1

+2

sidenote: если OP требует, чтобы отключенное поле фактически отключилось, вместо этого используйте атрибут 'readonly'. Это позволит полю POST в отличие от использования 'disabled' – Ronnie

Смежные вопросы