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

时间:2012-10-11 11:12:13

标签: php mysql

我面临一个奇怪的问题。我在我的网站上使用了一段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-> errorInfo());但没有显示错误。也试过尝试 - 但没什么。

我从phpMyAdmin手动输入了一行,然后就可以了。

我哪里错了?我检查了10次代码并且它非常完美。


更新

我在服务器的日志中发现了一个错误 我到底在哪里 - >执行

[2012年10月11日14:48:15] PHP致命错误:未捕获异常' PDOException' with message' SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;查看与您的MySQL服务器版本相对应的手册,以便在' event_id',' artist_id',' event_title',&#附近使用正确的语法39; date',' event_text',' event_start',' ev'在第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 {main}

在第527行/home/cubeworx/public_html/electronicdancemusic.net/MYArtist/admin/list_events.php中投放

4 个答案:

答案 0 :(得分:3)

作为对OP最终评论的回应:
啤酒会很好,但是由于技术还没有达到可以通过任何协议转移液体的阶段(尚未完成投票);由于这解决了您的问题,并且它可以节省您未来几小时的调试:一些提示(使用PDO时):

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

答案 1 :(得分:2)

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

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

将成为

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

始终使用''引用您的值,也是数值。无论如何,您通过文本发送查询。

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

答案 2 :(得分:1)

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

$ smnt__insert-> error_info()将满足您的需求。

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

答案 3 :(得分: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();
    ?>