4

私はここで本当に愚かなことをしているに違いありません。私はこれを 3 日間トラブルシューティングしてきましたが、うまくいきませんでした。

mysql_query() に送信される PHP 文字列は次のとおりです。

insert into post_replies (postID, fromID, toID, status) values ($id, $userID, $toID, ".g_unread.")

「ああ、SQL にエラーがあるに違いない」と言う前に、次の 2 つの点に注意してください。

  1. mysql_query() は true (1) を返します
  2. 文字列をテキスト ファイルにエクスポートします (以下を参照)。正常に動作します(新しい行が表示されます)
  3. 正確な(つまり、単にコピーして貼り付けたので、正確な)同じクエリが数行下で使用され、常に正常に動作します

私が試したもう1つのことは、テキストからクエリをロードしからmysql_query()に送信することでした-しかし、それは同じ奇妙な動作を生成します-成功(1)を返しますが、実際には新しい行は挿入されません.

これを別のプログラマーに見せたところ、私の PHP コーディング スタイルに不満を持っていました。彼は、INT は文字列としてラップする必要があり、それらを中括弧で囲む必要があると述べました (例: '{$id}')。しかし、もちろんそれは何も修正せず、動作はまったく同じでした。文字列の生成に問題があった場合、mysql_query() に送信する前にテキスト ファイルにエクスポートされるクエリに問題が発生します。彼はまた、私が時代遅れの mysql 関数を使用していると不満を漏らしました (mysqli 関数を使用する必要があります)。ただし、これでは、mysql_query() 経由で送信された数百の他のクエリが正常に機能する理由が説明されません。これには、この数行下のクエリも含まれます。export-to-text-file テキストを mysql_query() に直接貼り付けると、クエリが正常に機能する理由が説明されていません。

どうもありがとう。私はここで完全に迷っています。

更新#1:リクエストにより、ステートメントの周りのコードは次のとおりです。

$q = "insert into post_replies (postID, fromID, toID, status) values ($id, $userID, $toID, ".g_unread.")";
$result = mysql_query($q);
if ($result == true) {
    z($q);
} else {
    z('failure');
}

z() は、テキスト ファイルに簡単にエクスポートするために使用する関数です。ところで、クエリは常に z() に送信され、「失敗」は送信されません。

テキスト ファイルに送信される内容の例を次に示します。

insert into post_replies (postID, fromID, toID, status) values (2039, 8, 1, 1)

そのテキストを phpMyAdmin または上記の mysql_query() 関数に貼り付けると、行が挿入されることに注意してください。

更新 #2: 一部の懸念により、mysql[i] を使用するようにコードのこの部分を更新しました。

$mysqli = new mysqli(g_db_server, g_db_user, g_db_pass, g_db);
$result = $mysqli->query($q);

この単一のクエリのためだけに、別の接続を作成します。ただし、動作はまったく同じです。true を返しますが、ニュース行は作成されません。ただし、$q をテキスト ファイルにエクスポートし、そのテキストを上記の $mysqli->query() に貼り付けると、正常に動作し、期待どおりに新しい行が作成されます。

誰もがあきらめたように見えるので、私は現在、誰でもダウンロードして自分で試すことができる単一の MySQL テーブル / PHP ファイルに問題を切り分けることに取り組んでいます。

更新 #3: 解決しました! 並べ替え。挿入後に行が削除される原因となっているのは、周囲のコードの問題のようです。しかし、これでも mysql_insert_id() が 0 を返した理由を説明できません。おそらく mysql_insert_id() は複合キーで壊れます。とにかく、私は気にしません-それは修正されているからです。@ user1231958 の回答が最も近かったので、チェックを入れます。mysql_insert_id() にだまされて申し訳ありません。

4

5 に答える 5

2

テーブルと行を指定するときは、グラブ アクセントを使用するようにしてください。

$q = "INSERT INTO `post_replies` (`postID`, `fromID`, `toID`, `status`) VALUES ('$id', '$userID', '$toID', '".g_unread."')";

$result = mysql_query($q);
    if ($result == true) {
        z($q);
    } else {
        z('failure');
    }

それが機能するかどうか教えてください。

于 2012-07-27T03:31:46.373 に答える
0

私はこのような問題を抱えていました。問題は、デフォルト値がないフィールドにあることがわかりました。最近、LinuxサーバーからWindowsサーバーに移行しましたが、Linuxの使用中に少し怠惰になっているはずです。

問題は、Linuxサーバーを使用しているときに、すべてのフィールドをINSERTクエリに入力する必要がないことでした。何らかの理由で(理由はわかりませんが)、デフォルトになっているようですが、Windowsサーバーはそうすることで、mysqliエラー関数は一部のフィールドにデフォルトがないと言っていました。これらのフィールドを追加すると、正常に機能しました。

私はこの質問が答えられたことを知っていますが、これは同じ問題を抱えている他の人々を助けるかもしれません、結局私は他の誰かが3日間彼らの髪を抜いてほしくないのです。

于 2013-03-19T15:49:08.833 に答える
0

mysql_error()何かを返しますか?これは不十分かもしれませんが、挿入の実行中に正しいデータベースに接続していますか?

また、mysql でクエリ ログを有効にして、すべてのクエリを記録することもできます。Howtogeek には、この機能の有効化に関する記事があります。サーバーを再起動すると、指定したファイルに記録されたすべてのクエリが表示されるようになります。私のはこのように見えます。

/opt/local/libexec/mysqld, Version: 5.1.61-log (Source distribution). started with:
Tcp port: 3306  Unix socket: /opt/local/var/run/mysql5/mysqld.sock
Time                 Id Command    Argument
120727  8:57:09     1 Connect   root@localhost on foo
            1 Query /* test comment */ insert into test(foo) values(NOW())
            1 Quit

mysql サーバーに送信されるすべてのクエリを監視できるようになったので、クエリの前にコメントを付けて、ログで識別できるようにします。上記のログを生成するために、次の PDO コードを使用しました。

$dbh = new PDO("mysql:host=localhost;dbname=foo",'root','');
$dbh->exec("/* test comment */ insert into test(foo) values(NOW())");
于 2012-07-27T03:34:44.663 に答える
0

コマンドのコミットを妨げる何かがあるかどうかを確認する必要があります。クエリを実行した後、次のコマンドを試してください: mysql_query ( "COMMIT;" );

于 2017-02-11T13:47:52.207 に答える