2

我面临一个奇怪的问题。我正在使用一段代码,它在我的网站上 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()); 检查了错误。但没有显示错误。也试过尝试 - 抓住但没有。

我从 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 {主要}

扔在 /home/cubeworx/public_html/electronicdancemusic.net/MYArtist/admin/list_events.php 第 527 行

4

4 回答 4

3

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

  • 尝试将您的 ini 设置E_ALL | E_STRICT为避免警告和错误被抑制
  • 始终用于在查询失败时$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );强制 PDO 抛出。PDOExceptions
  • When query-ing, use dbName.tblName as much as possible, to avoid accidentally working on the wrong DB
  • Always check if a variable/array key exists before using it
  • Use prepared statements, preferably with named placeholders to ensure your code is more readable for yourself and others
于 2012-10-11T12:23:25.517 回答
2

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

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

会变成

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

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

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

于 2012-10-11T11:18:28.243 回答
1

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

$smnt__insert->error_info() 将拥有您所需要的。

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

于 2012-10-11T11:32:34.943 回答
0

使用$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();
    ?>
于 2012-10-11T11:24:34.960 回答