2

私は奇妙な問題に直面しています。Web サイト全体で 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 回チェックしましたが、完璧です。


アップデート

サーバーのログに正確にエラーが見つかりました->実行

[11-Oct-2012 14:48:15] PHP 致命的なエラー: メッセージ「SQLSTATE[42000] を伴う例外「PDOException」をキャッチできません: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。''event_id', 'artist_id', 'event_title', 'date', 'event_text', 'event_start', 'ev' at line 1' の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。 /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 を使用する場合):

  • E_ALL | E_STRICT警告やエラーが抑制されないように、ini を に設定してみてください。
  • クエリが失敗したときに$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );PDO を強制的にスローするために常に使用します。PDOExceptions
  • クエリを実行するときdbName.tblNameは、誤って間違った DB で作業することを避けるために、可能な限り使用してください。
  • 使用する前に、変数/配列キーが存在するかどうかを常に確認してください
  • できれば名前付きのプレースホルダーを使用して、準備されたステートメントを使用して、自分や他の人にとってコードが読みやすくなるようにします
于 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

Use $stmt_insert->bindParam instead of $stmt_insert->bindValue. Here is some example code:

<?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 に答える