PHP / MySQL更新数据库中的新闻记录问题
时间:2020-03-06 14:45:06 来源:igfitidea点击:
我有这个PHP代码,我试图用来让用户以某种形式编辑新闻记录,然后当他们按下"提交"按钮时,它将更新数据库中的记录。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。问题是,一切正常,但记录实际上未在数据库中更新。
有人可以看一下我的代码,看看哪里可能出现问题吗?
<?php $title = "Edit News"; include("../includes/header.php"); include("../includes/database.php"); $done = false; $expected = array('newstitle', 'newscontent', 'id'); if ($_GET && !$_POST) { if (isset($_GET['id']) && is_numeric($_GET['id'])) { $id = $_GET['id']; } else { $id = NULL; } if ($id) { $sql = "SELECT * FROM news WHERE id = $id"; $result = mysql_query($sql) or die ("Error connecting to database..."); $row = mysql_fetch_assoc($result); } // if form has been submitted, update record if (array_key_exists('update', $_POST)) { // prepare expected items for insertion into database foreach ($_POST as $key => $value) { if (in_array($key, $expected)) { ${$key} = mysql_real_escape_string($value); } } // abandon the process if primary key invalid if (!is_numeric($id)) { die('Invalid request'); } // prepare the SQL query $query = "UPDATE news SET title = '$title', content = '$content' WHERE id = $id"; // submit the query $done = mysql_query($query) or die("Error connecting to database..."); } } // redirect page if $id is invalid if ($done) { header("Location: $ROOT/admin/listnews.php"); exit; } ?>
解决方案
如果我们使用相同的数据从mysql cli运行该UPDATE,则用户发送的更新会更新吗?
如果没有,请检查转义字符。
if ($_GET && !$_POST) {
...
if (array_key_exists('update', $_POST)) {
不能确保更新代码永远不会触发吗?
下面一行中的$ content和$ title应该是$ newstitle和$ newscontent吗?
// prepare the SQL query $query = "UPDATE news SET title = '$newstitle', content = '$newscontent' WHERE id = $id";
可以尝试缩小问题范围的几件事:
- 在
if(array_key_exists('update',$ _POST))
块内回显一些调试文本,以确保我们真正到达那里。 " if"的顶部是if($ _ GET &&!$ _ POST)
,因此我们可能需要将此$ _POST
更改为$ _GET
。 - 我们是否尝试过在数据库调用之前回显
$ query
?它可以在命令行mysql界面上运行吗? - 如果我对
foreach($ _POST as $ key => $ value)的读取是正确的,我们将最终设置与$ expected
-相同名称的变量-($ newstitle,$ newscontent,$ id
)-但在sql中引用$ content
和$ title
。它们可能是导致此错误的原因,但需要引起注意。
在不查看表单HTML源代码的情况下,很难确切知道发生了什么,但是我认为
if (array_key_exists('update', $_POST)) {
如果需要,则需要将块移出外部,因为如果在其中,则永远不会执行该块。
如果我们不想使用某种测试框架,则在调试代码时,print()
是朋友。尝试找出正在执行和未执行的内容;我们会很快发现哪些假设是不正确的,以及错误的出处在哪里。
将此if语句从嵌套的if中取出:
if (array_key_exists('update', $_POST)) { ... }
然后添加以下条件:
if (count($_POST) && array_key_exists('update', $_POST)) { ... }
我敢肯定,它将解决问题。