【问题标题】:Unable to edit record from a table PDO PHP无法从表 PDO PHP 中编辑记录
【发布时间】:2015-07-29 16:10:38
【问题描述】:

我有一个记录列表,每个人都可以编辑。每当用户单击编辑时,就会出现一个输入掩码,其中需要输入新数据以替换旧数据。我使用 PDO 来处理数据库连接,我坚信问题是我无法更新现有表

这是我的旧帖子validation and data add to a db table的链接

第一个 sn-p 代码创建了一个表单,用户可以在其中输入一些数据。

<?php
error_reporting(-1);
ini_set('display_errors', 'On');
?>
<?php
$servername = "xxxx";
$username = "xxxx";
$password = "xxxxx";
$dbname = "xxxxx";

try {
    $dbh = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
catch(PDOException $e)
    {
    echo "Connection failed: " . $e->getMessage();
    }
?>
<?php
if ($_GET['action'] == 'edit') {
    //retrieve the record's information 
   $sth = $dbh->prepare("
  SELECT nome, cognome, indirizzo, civico, citta, prov
  FROM   tagesroma
  WHERE  id = ?
");
$sth->execute(array($_GET['id']));
    } else {
    //set values to blank
    $nome = '';
    $cognome = '';
    $indirizzo = '';
    $civico = 0;
    $citta = '';
    $prov = '';
}
?>
<html>
    <head>
        <meta charset="UTF-8">
        <title><?php echo ucfirst($_GET['action']); ?> Tages</title>
        <style type="text/css">
        <!--
        #error { background-color: #600; border: 1px solid #FF0; color: #FFF;
         text-align: center; margin: 10px; padding: 10px; }
        -->
        </style>
    </head>
    <body>
        <?php
            if (isset($_GET['error']) && $_GET['error'] != '') {
                echo '<div id="error">' . $_GET['error'] . '</div>';
            }
        ?>
        <form action="commit.php?action=<?php echo $_GET['action']; ?>&type=tages"
           method="post" accept-charset="UTF-8">
            <table>
                <tr>
                    <td>Nome</td>
                    <td><input type="text" name= "nome" value="<?php echo !empty($_POST['nome']) ? $_POST['nome'] : ''; ?>"></td>
                </tr><tr>
                    <td>Cognome</td>
                    <td><input type="text" name= "cognome" value="<?php echo !empty($_POST['cognome']) ? $_POST['cognome'] : ''; ?>"></td>                  
                </tr><tr>
                    <td>Indirizzo</td>
                    <td><input type="text" name= "indirizzo" value="<?php echo !empty($_POST['indirizzo']) ? $_POST['indirizzo'] : ''; ?>"></td>
                </tr><tr>
                    <td>Civico</td>
                    <td><input type="text" name= "civico" value="<?php echo !empty($_POST['civico']) ? $_POST['civico'] : ''; ?>"></td>
                </tr><tr>
                    <td>Citta</td>
                    <td><input type="text" name= "citta" value="<?php echo !empty($_POST['citta']) ? $_POST['citta'] : ''; ?>"></td>
                </tr><tr>
                    <td>Prov</td>
                    <td><input type="text" name= "prov" value="<?php echo !empty($_POST['prov']) ? $_POST['prov'] : ''; ?>"></td>
                </tr><tr>
                    <td colspan="2" style="text-align: center;">
                    <?php
                        if ($_GET['action'] == 'edit') {
                            echo '<input type="hidden" value="' . $_GET['id'] . '" name="id" />'; 
                        }
                    ?>
                    <input type="submit" name="submit"
                    value="<?php echo ucfirst($_GET['action']); ?>" />
                    </td>
                </tr>
            </table>
        </form>
    </body>
</html>

代码的第二部分验证输入的数据,当且仅当一切正确时,新数据才会更新

<?php
error_reporting(-1);
ini_set('display_errors', 'On');
?>
<?php
$servername = "xxx";
$username = "xxx";
$password = "xxxx";
$dbname = "xxxx";

try {
    $dbh = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
catch(PDOException $e)
    {
    echo "Connection failed: " . $e->getMessage();
    }
    $sth = $dbh->prepare("use accessibilita");
?>
<?php
 switch ($_GET['action']) {    
case 'edit':
    switch ($_GET['type']) {
    case 'tages':
        $error = array();
        $nome = isset($_POST['nome']) ?
            trim($_POST['nome']) : '';
        if (empty($nome)) {
            $error[] = urlencode('Si prega di inserire un nome.');
        }
        $cognome = isset($_POST['cognome']) ?
            trim($_POST['cognome']) : '';
        if (empty($cognome)) {
            $error[] = urlencode('Si prega di inserire un cognome.');
        }
        $indirizzo = isset($_POST['indirizzo']) ?
            trim($_POST['indirizzo']) : '';
        if (empty($indirizzo)) {
            $error[] = urlencode('Si prega di inserire un indirizzo.');
        }
        $civico = isset($_POST['civico']) ?
            trim($_POST['civico']) : '';
        if (empty($civico)) {
            $error[] = urlencode('Si prega di inserire un numero civico.');
        }
        $citta = isset($_POST['citta']) ?
            trim($_POST['citta']) : '';
        if (empty($citta)) {
            $error[] = urlencode('Si prega di inserire una citta valida.');
        }
        $prov = isset($_POST['prov']) ?
            trim($_POST['prov']) : '';
        if (empty($prov)) {
            $error[] = urlencode('Si prega di inserire una provincia.');
        }
        if (empty($error)) {
          $stmt = $dbh->prepare("UPDATE tagesroma SET nome=?, cognome=?, indirizzo=?, civico=?, citta=?, prov=? WHERE id=1");
          $stmt->execute(array($nome, $cognome, $indirizzo, $civico, $citta, $prov));         
        } else {
          header('Location:tages.php?action=edit&id=' . $_GET['id'] .
              '&error=' . join($error, urlencode('<br/>')));
        }
        break;
    }
    break;
}
?>

<html>
 <head>
  <title>Commit</title>
  <meta charset="UTF-8">
 </head>
 <body>
  <p>Done!</p>
 </body>
</html>

【问题讨论】:

  • 把prepare和execute放在一个TRY CATCH块中并报告任何错误。然后你可能会看到什么问题
  • 很确定您的表单操作是错误的。
  • 你知道吗?直到今天一切正常,但现在这并不是绝对令人沮丧
  • @RiggsFolly 你能给我一个答案或建议吗?我现在无法处理代码
  • 请执行一些调试,以便您可以将代码示例缩短到相关部分,并且能够更好地解释代码执行与您期望的不同之处。

标签: php mysql pdo


【解决方案1】:

我已经在我的网络服务器上重新创建了您的代码,它似乎可以按您的预期工作 - 我唯一更改的是 mysql 的登录信息;我在您的表单中输入的任何内容都会使用 id=1 更新记录,或者如果数据未验证,则会生成错误消息。显然我必须创建一个与您预期的架构匹配的数据库,所以我只是将除 id 之外的所有字段都创建为 VARCHAR(255)。

我有几个建议可以尝试:

  1. 检查您的数据库用户是否具有 UPDATE 权限集
  2. 检查数据库是否确实有一条 id=1 的记录(您是否已删除并替换了该记录,并且 id 已被 auto_increment 更改?)

希望这会有所帮助!

**编辑:与您交谈后,请查看以下代码(至少在我的服务器上):

tags.php:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');
?>
<?php
$servername = "localhost";
$username = "redacted";
$password = "redacted";
$dbname = "test";

try {
    $dbh = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
catch(PDOException $e)
    {
    echo "Connection failed: " . $e->getMessage();
    }
?>
<?php
if ($_GET['action'] == 'edit') {
    //retrieve the record's information 
   $sth = $dbh->prepare("
  SELECT nome, cognome, indirizzo, civico, citta, prov
  FROM   tagesroma
  WHERE  id = ?
");
$sth->execute(array($_GET['id']));
    } else {
    //set values to blank
    $nome = '';
    $cognome = '';
    $indirizzo = '';
    $civico = 0;
    $citta = '';
    $prov = '';
}
?>
$thisrecord=$sth->fetch(PDO::FETCH_ASSOC);

<html>
    <head>
        <meta charset="UTF-8">
        <title><?php echo ucfirst($_GET['action']); ?> Tages</title>
        <style type="text/css">
        <!--
        #error { background-color: #600; border: 1px solid #FF0; color: #FFF;
         text-align: center; margin: 10px; padding: 10px; }
        -->
        </style>
    </head>
    <body>
        <?php
            if (isset($_GET['error']) && $_GET['error'] != '') {
                echo '<div id="error">' . $_GET['error'] . '</div>';
            }
        ?>
    <!-- NOTICE THE ADDITION TO THE END OF THE action= TO PASS THE ID ON TO YOUR SCRIPT -->
        <form action="commit.php?action=<?php echo $_GET['action']; ?>&type=tages&id=<?php echo $_GET["id"];?>"
           method="post" accept-charset="UTF-8">
            <table>
                <tr>
                    <td>Nome</td>
                    <td><input type="text" name= "nome" value="<?php echo !empty($_POST['nome']) ? $_POST['nome'] : $thisrecord["nome"]; ?>"></td>
                </tr><tr>
                    <td>Cognome</td>
                    <td><input type="text" name= "cognome" value="<?php echo !empty($_POST['cognome']) ? $_POST['cognome'] : $thisrecord["cognome"]; ?>"></td>                  
                </tr><tr>
                    <td>Indirizzo</td>
                    <td><input type="text" name= "indirizzo" value="<?php echo !empty($_POST['indirizzo']) ? $_POST['indirizzo'] : $thisrecord["indirizzo"]; ?>"></td>
                </tr><tr>
                    <td>Civico</td>
                    <td><input type="text" name= "civico" value="<?php echo !empty($_POST['civico']) ? $_POST['civico'] : $thisrecord["civico"]; ?>"></td>
                </tr><tr>
                    <td>Citta</td>
                    <td><input type="text" name= "citta" value="<?php echo !empty($_POST['citta']) ? $_POST['citta'] : $thisrecord["citta"]; ?>"></td>
                </tr><tr>
                    <td>Prov</td>
                    <td><input type="text" name= "prov" value="<?php echo !empty($_POST['prov']) ? $_POST['prov'] : $sth["prov"]; ?>"></td>
                </tr><tr>
                    <td colspan="2" style="text-align: center;">
                    <?php
                        if ($_GET['action'] == 'edit') {
                            echo '<input type="hidden" value="' . $_GET['id'] . '" name="id" />'; 
                        }
                    ?>
                    <input type="submit" name="submit"
                    value="<?php echo ucfirst($_GET['action']); ?>" />
                    </td>
                </tr>
            </table>
        </form>
    </body>
</html>

commit.php:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');
?>
<?php
$servername = "localhost";
$username = "redacted";
$password = "redacted";
$dbname = "test";

try {
    $dbh = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
catch(PDOException $e)
    {
    echo "Connection failed: " . $e->getMessage();
    }
    $sth = $dbh->prepare("use accessibilita");
?>
<?php
 switch ($_GET['action']) {    
case 'edit':
    switch ($_GET['type']) {
    case 'tages':
        $error = array();
        $nome = isset($_POST['nome']) ?
            trim($_POST['nome']) : '';
        if (empty($nome)) {
            $error[] = urlencode('Si prega di inserire un nome.');
        }
        $cognome = isset($_POST['cognome']) ?
            trim($_POST['cognome']) : '';
        if (empty($cognome)) {
            $error[] = urlencode('Si prega di inserire un cognome.');
        }
        $indirizzo = isset($_POST['indirizzo']) ?
            trim($_POST['indirizzo']) : '';
        if (empty($indirizzo)) {
            $error[] = urlencode('Si prega di inserire un indirizzo.');
        }
        $civico = isset($_POST['civico']) ?
            trim($_POST['civico']) : '';
        if (empty($civico)) {
            $error[] = urlencode('Si prega di inserire un numero civico.');
        }
        $citta = isset($_POST['citta']) ?
            trim($_POST['citta']) : '';
        if (empty($citta)) {
            $error[] = urlencode('Si prega di inserire una citta valida.');
        }
        $prov = isset($_POST['prov']) ?
            trim($_POST['prov']) : '';
        if (empty($prov)) {
            $error[] = urlencode('Si prega di inserire una provincia.');
        }
        if (empty($error)) {
          $stmt = $dbh->prepare("UPDATE tagesroma SET nome=?, cognome=?, indirizzo=?, civico=?, citta=?, prov=? WHERE id=?"); // changed to WHERE id=?
          $stmt->execute(array($nome, $cognome, $indirizzo, $civico, $citta, $prov,$_GET["id"])); // added $_GET["id"] to the end        
        } else {
          header('Location:tages.php?action=edit&id=' . $_GET['id'] .
              '&error=' . join($error, urlencode('<br/>')));
        }
        break;
    }
    break;
}
?>

<html>
 <head>
  <title>Commit</title>
  <meta charset="UTF-8">
 </head>
 <body>
  <p>Done!</p>
 </body>
</html>

花一点时间看看更改 - 结果发现您的问题是它总是编辑 id=1 的记录,而不管您选择要编辑的记录是什么;此更新后的代码添加了您缺少的位以传递“当前正在编辑”记录的 id。

进一步编辑:根据您的要求,我已更改 tags.php 以在顶部显示您的查询结果。您已经将 $sth 设置为当前值或初始化了它们应有的值,并且您还拥有 !empty?那里 - 您需要做的就是将两者放在一起。

【讨论】:

  • 这是一个非常有用的答案我想问您是否可以将此讨论移至聊天,因为我需要与您讨论另一个问题您同意吗?
  • 所以我可以将此讨论移至聊天吗??
  • 嘿,我无法将此讨论移至聊天
  • 你应该在房间里告诉我
  • 我尝试时出现服务器错误,当你有东西时告诉我
【解决方案2】:
$errors = $stmt->errorInfo();
    foreach ($errors as $error) {
        echo $error ,'<br />';
    }

您可以使用上面的代码找出您遇到的错误

【讨论】:

  • 如果您在查询执行中遇到任何错误,这将显示错误
【解决方案3】:

添加一些错误处理代码。

您设置了 PDO::ERRMODE_EXCEPTION,因此错误应该引发异常。

这里

if (!empty($error)) {
    header('Location:tages.php?action=edit&id=' . $_GET['id'] . '&error=' . join($error, urlencode('<br/>')));
    exit;
}

try {
    $stmt = $dbh->prepare("UPDATE tagesroma SET nome=?, cognome=?, indirizzo=?, civico=?, citta=?, prov=? WHERE id=1");
    $stmt->execute(array($nome, $cognome, $indirizzo, $civico, $citta, $prov));         
}
catch ( PDOException $e ) {
    echo 'INSERT FAILED WITH: ' . $e->getMessage();
    exit;
}
catch( Exception $ex ) {
    echo 'Some other error ' . $ex->getMessage();
    exit;
}

【讨论】:

  • 我一回到家就试一试,然后告诉你进展如何
猜你喜欢
  • 2015-03-12
  • 1970-01-01
  • 2013-06-18
  • 2016-12-29
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
相关资源
最近更新 更多