mysql execute() (PDO) 不在表中插入任何内容

Posted

技术标签:

【中文标题】mysql execute() (PDO) 不在表中插入任何内容【英文标题】:mysql execute() (PDO) does not INSERT anything in table 【发布时间】:2012-10-02 00:54:59 【问题描述】:

我遇到了一个奇怪的问题。我正在使用一段代码,它在我的网站上 100% 有效,但在特定的地方不起作用。这是代码:

$stmt_insert_query = "INSERT INTO mya_events(event_id, artist_id, event_title, date, event_text, event_start, event_duration, genre, soundcloud_preview, event_type, country, ext, clicks, active) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
                                $stmt_insert = $db->prepare($stmt_insert_query);
                                $stmt_insert->bindValue(1, $next_avail, PDO::PARAM_INT);
                                $stmt_insert->bindValue(2, $_id, PDO::PARAM_INT);
                                $stmt_insert->bindValue(3, $_POST['event_title'], PDO::PARAM_STR);
                                $stmt_insert->bindValue(4, $event_date, PDO::PARAM_STR);
                                $stmt_insert->bindValue(5, $_POST['event_text'], PDO::PARAM_STR);
                                $stmt_insert->bindValue(6, $_POST['event_start'], PDO::PARAM_STR);
                                $stmt_insert->bindValue(7, $_POST['event_duration'], PDO::PARAM_STR);
                                $stmt_insert->bindValue(8, 'electronica', PDO::PARAM_STR);
                                $stmt_insert->bindValue(9, '', PDO::PARAM_STR);
                                $stmt_insert->bindValue(10, 'dj_event', PDO::PARAM_STR);
                                $stmt_insert->bindValue(11, 'US', PDO::PARAM_STR);
                                $stmt_insert->bindValue(12, '', PDO::PARAM_STR);
                                $stmt_insert->bindValue(13, 0, PDO::PARAM_INT);
                                $stmt_insert->bindValue(14, 'y', PDO::PARAM_STR);
                                $stmt_insert->execute();

在这段代码之后,我正在显示一个显示的文本。我还用 print_r($db->e​​rrorInfo()); 检查了错误。但没有显示错误。也尝试了 try - catch 但没有。

我从 phpMyAdmin 手动输入了一行,它可以工作。

我哪里错了?我检查了 10 次代码,它很完美。


更新

我在服务器的日志中发现了一个错误 正是我做的地方->执行

[2012 年 10 月 11 日 14:48:15] PHP 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在 ''event_id'、'artist_id'、'event_title'、'date'、'event_text'、'event_start'、'ev' at line 1' 附近使用正确的语法/home/cubeworx/public_html/electronicdancemusic.net/MYArtist/admin/list_events.php:527 堆栈跟踪:

0 /home/cubeworx/public_html/electronicdancemusic.net/MYArtist/admin/list_events.php(527):PDOStatement->execute()

1 主

在第 527 行的 /home/cubeworx/public_html/electronicdancemusic.net/MYArtist/admin/list_events.php 中抛出

【问题讨论】:

查看How to squeeze error message out of PDO? 是的,我没有收到任何错误,并且代码是安全可靠的。 我很确定您正在遇到错误,但没有看到它们。我可以在您的代码中看到一个问题,使用不带反引号的 date,这是 mySQL 中的保留字(并且需要反引号)。因此问题的链接 - 从 PDO 获取错误消息可能很麻烦 @AdrianTanase:可以肯定的是,您尝试过设置$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );,对吧?不要忘记您可能也在使用不同的数据库。最好将INSERT INTO mya_events 更改为INSERT INTO dbName.mya_events。最后:尝试将您的 ini 设置为 E_ALL | E_STRICT 以避免警告和错误被抑制 您有一个名为date 的列,这是一个mysql 保留字。在您的查询中,在该列名称周围加上反引号,或者将其更改为非保留字。 【参考方案1】:

好的做法是在表名、列等中使用`` 符号,这样它就不会干扰数据库引擎本身。

INSERT INTO mya_events(event_id, artist_id, event_title, ...

会变成

INSERT INTO `mya_events`(`event_id`, `artist_id`, `event_title`,

始终用 '' 引用您的值,也包括数值。无论如何,您都可以通过其文本发送查询。

我认为显示似乎失败的查询很有用。 您可以在插入后添加检查,如果该行不在数据库中,则将其打印在日志中的某个位置,并向我们显示该特定查询。

【讨论】:

引用不可能是这里的问题,IMO:这是一个 PDO 准备好的语句,他传递了每个参数的类型,所以它们应该被正确引用。 IMO,被认为是使用反引号的好习惯。相反,我认为最好不要使用保留关键字。 “好”的做法与否,它仍然不能解决问题,它只是让它成为更多引用的失败。不管怎样,毕竟还有flowchart for good code(是的,这是个笑话)。另外,Mike,您特别熟悉 PDO 吗?我不确定在插入尝试后您希望该“最终”查询来自何处,因为 (as laid out in detail in this answer) 无法获得在其上运行的那种形式的 query数据库。我已经使用 PDO 构建了一些应用程序,但也无法记录“最终”查询。 @jim 引号实际上可能解决了问题,这可能是错误命名为date 的列。 @Pekka 好吧,嘿,看来我该回到我的代码了!无论哪种方式,这种调试困难是我在一般情况下放弃 PHP 和尽可能专业地放弃 PDO 的原因之一。为你们点赞哈哈【参考方案2】:

使用$stmt_insert->bindParam 代替$stmt_insert->bindValue。 下面是一些示例代码:

<?php
    /* Execute a prepared statement by binding PHP variables */
    $calories = 150;
    $colour = 'red';
    $sth = $dbh->prepare('SELECT name, colour, calories
        FROM fruit
        WHERE calories < ? AND colour = ?');
    $sth->bindParam(1, $calories, PDO::PARAM_INT);
    $sth->bindParam(2, $colour, PDO::PARAM_STR, 12);
    $sth->execute();
    ?>

【讨论】:

【参考方案3】:

上面已经确定了问题-但是您的错误在于您可能正在检查数据库错误,但您没有检查语句错误

$smnt__insert->error_info() 会有你需要的。

捕获此问题的最简单方法是将批次(准备、绑定和执行)包装到 try/catch 块中,并将 PDO 设置为异常模式错误报告。抛出的异常可能来自数据库或语句,并为您提供所有详细信息。无需专门检查两者即可轻松捕获两者。

【讨论】:

【参考方案4】:

作为对 OP 最终评论的回应: 啤酒会很好,但由于技术还没有达到可以通过任何协议传输液体的阶段(但),投票就可以了;)。由于这解决了您的问题,并且可以为您节省数小时的调试时间:一些技巧(使用 PDO 时):

尝试将您的 ini 设置为 E_ALL | E_STRICT 以避免警告和错误被抑制 总是在查询失败时使用$db-&gt;setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 强制PDO 抛出PDOExceptions。 查询时,尽量使用dbName.tblName,避免误操作错误的DB 在使用之前始终检查变量/数组键是否存在 使用准备好的语句,最好使用 命名占位符,以确保您的代码对您自己和其他人更具可读性

【讨论】:

以上是关于mysql execute() (PDO) 不在表中插入任何内容的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:PDO事务无法正常工作

PDO插入BindParam mysql

在mysql中使用pdo的参数号无效问题

pdo中query()与prepare().execute()

MySQL pdo预处理能防止sql注入的原因

PHP PDO 等效于 mysql_num_rows [重复]