【问题标题】:PHP PDO table not updating data [closed]PHP PDO表不更新数据[关闭]
【发布时间】:2015-12-12 11:11:00
【问题描述】:

我是使用 PHP 编码的新手,在尝试创建一个待办事项列表时,我在创建一个名为“add.php”的文件后取消了操作,该文件应该向表中添加新数据。主文件 index.php 调用表格元素 ok 并将它们显示在浏览器上,但我无法添加新项目。

add.php中的代码在这里:

<?php

require_once 'app/init.php';

if(isset($_POST['name'])) {
    $name = trim($POST['name']);

    if(!empty($name)) {
        $addedQuery = $db->prepare("
            INSERT INTO items (name, user, done, created) 
            VALUES (:name, :user, 0, NOW() )
                ");

        $addedQuery->execute([
            'name' => $name,
            'user' => $_SESSION['user_id']
            ]);
    }
}

header('location: index.php');




?> 

如果有帮助,我在 WampServer 2.5 上使用 PHP 5.5.12 和 MySQL 5.6.17

【问题讨论】:

  • 要么是require_once 'app/init.php'; 的问题,要么是POST。因为这就是我没有你做的所有事情,当我伪造POST 时,我可以很好地插入数据。其他一切都没有改变。好吧,除了做一个 start_session 并将那个 var 塞进去。但除此之外!

标签: php mysql pdo


【解决方案1】:

好的......在任何人误解必须使用冒号作为数组中的占位符之前,这是一个神话。

  • 它在 PDO 中是​​完全合法/有效的语法。 (参考脚注)。

  • 但是,冒号确实需要在 VALUES() 中。

真正的问题在于这个$POST,并且缺少它的下划线$_POST

错误报告会给你一个未定义的变量通知。

error reporting 添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:显示错误应该只在暂存阶段完成,而不是在生产阶段。

另外,确保会话数组已设置/不为空,并且会话已启动。这未在您的帖子中显示/指示。

还要确保您的表单确实使用 POST 方法,并且您的输入包含输入的名称属性。

即:&lt;input type="text" name="name"&gt;

同时检查 PDO 中的错误:

你的连接方式也不清楚,所以要确定你确实是用PDO来连接的。

  • 不同的 MySQL API 不会混合使用。

其他参考资料:


脚注:

正如 cmets 中所述,并且是 VolkerK 的一个不错的发现:

"它在内部用前导冒号存储,见"

【讨论】:

  • smart-ass-mode on:“完全合法/有效”,但它在内部存储 前导冒号,请参阅github.com/php/php-src/blob/master/ext/pdo/pdo_stmt.c#L366 ;-)
  • @VolkerK 不错的发现。如果您不介意,我会将其添加到我的答案中。 干杯
  • 我一直在寻找,因为我怀疑它是相反的——但数据就是数据 :)
  • @VolkerK 我早就知道数组中不需要冒号,而且在我的一生中,从来没有找到它的文档。您找到/提供的内容,现在可以让未来的读者对这个问题进行猜测,谢谢。 :)
  • 我不敢相信我是那么愚蠢并且错过了丢失的下划线。先生,我向您致敬!和坦克为我清除结肠神话。
【解决方案2】:

在 PDO 执行方法中传递命名参数时,您必须将 then 作为名称以冒号为前缀的数组传递(:name 而不是 name)。

并且在传递索引参数时(在准备方法中使用?),那么您在执行方法中根本不会关联键。

那就试试吧:

$addedQuery->execute([ ':name' => $name, ':user' => $_SESSION['user_id'] ]);

并确保$_SESSION['user_id'] 设置正确。

编辑: 你有没有在他的 php.ini 中打开 php 错误?

【讨论】:

  • err.... 不,不是必需的,并且是未记录的功能。 'name' =&gt; $name, 完全有效。
  • php.net/manual/en/pdostatement.bindparam.php 在 section 参数下,它明确指出**这将是一个格式为 :name 的参数名称。 **
  • 谢谢你的课,但我不需要它;我已经知道这一点,而且我已经说过的话是事实。 ;-) 无论如何,然后等待 OP。哦,我确实说过“无证”。
  • 你得到的那些不赞成票,其中一个不是我的,以防你可能想知道,因为我现在刚得到一个 dv。如果那是你的,那就没有必要了,应该收回。你得到这些是因为你错了。
  • 我投了一个反对票,因为答案是错误的;至少在这个问题的背景下。 you must,不,没有区别。因此,这充其量只是一种编码风格建议。
猜你喜欢
  • 2022-01-02
  • 2015-05-20
  • 2014-01-26
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
相关资源
最近更新 更多