用PHP/PDO和mySQL更新数据库记录

用PHP/PDO和mySQL更新数据库记录,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我有一个数据库“Telefoon”和一个表“Telefoonnumers”。表中有“naam”、“编号”和“mobiel”列 我正在尝试创建一个.php页面,在那里我可以更新记录。我很肯定这是对的,但不知何故,一切都没有改变 在这里,您填写更新的记录,当您单击按钮时,它会转到下一页进行更新 <!DOCTYPE HMTL> <html> <head> <title>Wijzigen telefoonnummer</title>

我有一个数据库“Telefoon”和一个表“Telefoonnumers”。表中有“naam”、“编号”和“mobiel”列

我正在尝试创建一个.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>

Wijzigen telefoonnummer

我使用您的代码设置了快速测试页面。我发现有两件事情不能正常工作

  • 初始表单-表单中的“naam”字段被禁用。这意味着该参数不能进入Wijzig.php页面。因为“naam”总是空的,因此等于“”,所以它不会通过if语句。为了让它工作,我在第一个表单中重新启用了“naam”字段
  • UPDATE语句中的参数-在UPDATE语句中,它试图访问名为“:telefoonnumer”的参数,但在参数中使用了“:numer”。这将导致PDO在执行时抛出异常
  • Quick Note-我在wijzig.php中添加了一个echo语句,以便成功运行将产生某种可见的结果

    至此,我更新了两个文件,如下所示:

    index.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>
    
    
    Wijzigen telefoonnummer
    
    在对现有记录运行时,它会生成以下输出:

    更改的记录数:1


    我使用您的代码设置了快速测试页面。我发现有两件事情不能正常工作

  • 初始表单-表单中的“naam”字段被禁用。这意味着该参数不能进入Wijzig.php页面。因为“naam”总是空的,因此等于“”,所以它不会通过if语句。为了让它工作,我在第一个表单中重新启用了“naam”字段
  • UPDATE语句中的参数-在UPDATE语句中,它试图访问名为“:telefoonnumer”的参数,但在参数中使用了“:numer”。这将导致PDO在执行时抛出异常
  • Quick Note-我在wijzig.php中添加了一个echo语句,以便成功运行将产生某种可见的结果

    至此,我更新了两个文件,如下所示:

    index.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>
    
    
    Wijzigen telefoonnummer
    
    在对现有记录运行时,它会生成以下输出:

    更改的记录数:1


    有个打字错误,$dhb!=$胸径。除此之外,请确保它进入if行,并将所有PDO代码包装在try/catch块中以检查错误。啊,拼写错误现在被删除了!但是,它仍然没有改变数据库中的任何内容。我很确定它会出现在if()语句中。我在另一个文件中得到了相同的行,在那里它运行良好。但是该文件添加了一个记录而不是更改它。另外,在Coda 2中,当我预览.php文件时,它们都会出现如下错误:-警告:PDO::_construct():[2002]没有这样的文件或目录(尝试通过unix:///var/mysql/mysql.sock)在第21行出现致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[HY000][2002]第21行-:21堆栈跟踪中没有这样的文件或目录:#0-(21):PDO->u构造('mysql:host=loca…','root','root')#1{main}抛出,但最后一个文件是唯一没有这样做的文件。好吧,也许你是对的,它没有输入if()语句!(通过在代码中添加一些print()进行测试)。但它仍然不会改变数据库中的任何内容。与数据库的连接是正确的,我只是以与其他文件相同的方式进行了连接。那么SQL代码呢?语法没有错,对吗?或者bindValue是否限制为1或其他什么?语法看起来是正确的。如果它现在进入If语句,请将PDO代码包装在一个try中/catch块查看是否有错误。您也可以将execute语句返回到一个值并转储该值以查看返回的内容。有一个输入错误,$dhb!=$dbh。除此之外,请确保它进入if行,并将所有PDO代码包装在try/catch块中以检查错误。啊,输入错误现在已被删除!但仍然不是changi我很确定它会进入if()语句。我在另一个文件中得到了相同的行,在那里它可以正常工作。但是该文件添加了一条记录,而不是更改它。另外,在Coda 2中,当我预览.php文件时,它们都会出现如下错误:-----警告:PDO::_construct():[2002]没有这样的文件或目录(正在尝试通过unix:///var/mysql/mysql.sock)第21行中出现致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[HY000][2002]没有这样的文件或目录”,在-:21堆栈跟踪:#0-(21):PDO->u构造('mysql:host=loca…','root','root')#1{main}抛出-在第21行------,但最后一个文件是唯一没有这样做的文件。好吧,也许你是对的,它没有输入if()语句!(通过在代码中添加一些print()进行测试)。但它仍然不会改变数据库中的任何内容。与数据库的连接是正确的,我只是以与其他文件相同的方式进行了连接。那么SQL代码呢?语法没有错,对吗?或者bindValue是否限制为1或其他什么?语法看起来是正确的。如果它现在进入If语句,请将PDO代码包装在一个try中/catch块以查看是否有任何错误。您还可以将execute语句返回一个值,并转储该值以查看返回的内容。侧注:如果OP需要实际禁用该禁用字段,请改用
    readonly
    属性。这将允许该字段进行POST,而不像使用
    disabled
    侧注:如果OP需要禁用的field实际已禁用,请改用
    只读
    属性。这将允许该字段发布,而不像使用
    禁用
    <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>