0

私はphpとmysqlでかなり奇妙な問題を抱えています。私のphpスクリプトで次のことをしています:

$query1 = "SELECT * FROM ".$src;
$ans1 = mysql_query($query1,$vitoquenId);
echo "<p>Query: \"".$query1."\"<br/>Error: \"".mysql_error()."\"<br/>Total rows extracted: ".mysql_num_rows($ans1)."</p>";

これを行うとき、これは出力です:

Query: "SELECT * FROM Almacen"
Error: ""
Total rows extracted: 0

問題は、imが0行を取得することを想定していないことです。奇妙なことに、エラーは報告されません。ユーザーにすべてのアクセス許可を付与し、rootユーザーとしてデータベースに接続しようとしましたが、同じ動作をしました。

mysqlコマンドラインで直接クエリを実行すると、次のようになります。

mysql> SELECT * FROM Almacen;
+----+-------------+------------+--------+
| id | nombre      | tipo       | status |
+----+-------------+------------+--------+
|  1 | Tienda      | Principal  | Activo |
|  2 | Dep�sito    | Secundario | Activo |
|  3 | Chaguaramos | Secundario | Activo |
+----+-------------+------------+--------+
3 rows in set (0.00 sec)

xamppサーバーと、自分で構成したサーバーを使用してみましたが、同じ動作が得られました。考えたすべてのログをチェックし、すべてのクエリをログに記録するようにmysqlを構成しましたが、異常は発生していないようです。

mysqlログには次の情報が表示されます。

110802 16:21:49       101 Connect   victor@localhost on 
                      101 Init DB   saw
                      101 Init DB   sawprueba
                      101 Query SELECT * FROM Almacen
                      101 Quit

apacheログには何も表示されず、サイト固有のログも表示されません。どうか、これを解読しようとする手がかりは非常に高く評価されます!!! ありがとう!!!=)

編集:

問題を見つけました。それはaefxxの答えと関係があります。

プログラムimwritingは移行ツールです。あるデータベースから情報を抽出して処理し、別のデータベースに挿入します。そのためには、2つのデータベースに接続する必要があります。PHPのドキュメントで提案されているように、シングルトンパターンを使用して2つのクラスを介して接続します。接続ファイルはgithubリポジトリで確認できます。

dbに接続するには、次のようにこのクラスを呼び出します。

$vitoquen = Vitoquen::singleton();
$newVitoquen = NewVitoquen::singleton();
$vitoquenId = $vitoquen->getId();
$newVitoquenId = $newVitoquen->getId();

何が起こっているのかというと、何らかの理由で、2つの別々の接続を作成せず、代わりに1つの接続だけを作成し、空の2番目のデータベースである新しいデータベースを使用します。mysqlログを見たときに手がかりを得ました:

110802 16:21:49       101 Connect   victor@localhost on 
                      101 Init DB   saw
                      101 Init DB   sawprueba
                      101 Query SELECT * FROM Almacen
                      101 Quit

101InitDBが2回表示されます。1つはのためにsaw、もう1つはsawprueba。今、私はそれが2つの別々の接続を作成しない理由を理解していません...何か提案はありますか?

ご助力ありがとうございます!!!=)

編集:

私はまだ自己回答できませんが、これが私の問題の解決策です。とにかくこれを読んで(そしていくつかの答えを)時間を割いてくれた人々に感謝します!

php mysql_connect()関数のドキュメントに見られるように、デフォルトnew_linkでと呼ばれるオプションのパラメーターを受け取りfalseます。

new_link
同じ引数を使用してmysql_connect()を2回呼び出すと、新しいリンクは確立されませんが、代わりに、すでに開いているリンクのリンク識別子が返されます。new_linkパラメーターはこの動作を変更し、同じパラメーターでmysql_connect()が以前に呼び出された場合でも、mysql_connect()が常に新しいリンクを開くようにします。SQLセーフモードでは、このパラメータは無視されます。

したがって、両方の接続クラスでmysql_connect()の呼び出しに追加の最後のパラメーターとしてtrueを追加する必要がありました。解決済み=)

4

3 に答える 3

1

DBMSに接続するときに、適切なデータベース(スキームとも呼ばれます)を選択しましたか?

例:

mysql_select_db("mydatabase", $link);
于 2011-08-02T21:31:57.417 に答える
1

最小限のエラー処理と追加のクエリを追加して、mysql が問題のテーブルについて「考えている」ことを確認しましょう。

$query1 = "SHOW TABLE STATUS LIKE '$src'";
echo '<pre>Debug: query1=', $query1, "</pre>\n";
$ans1 = mysql_query($query1, $vitoquenId)
    or die(mysql_error());
while ( false!==($row=mysql_fetch_assoc($ans1)) ) {
    foreach( $row as $key=>$value ) {
        echo $key,'="', $value, '" ';
    }
    echo "<br />\n";
}

$query1 = "SELECT * FROM ".$src;
echo '<pre>Debug: query1=', $query1, "</pre>\n";
$ans1 = mysql_query($query1,$vitoquenId)
    or die(mysql_error());
echo "<p>Query: \"".$query1."\"<br/>Error: \"".mysql_error()."\"<br/>Total rows extracted: ".mysql_num_rows($ans1)."</p>";
于 2011-08-02T21:34:21.853 に答える
0

ローカル データベースへの接続の場合:

     $dbhost = 'localhost';
     $dbuser = 'root';
     $dbpass = '';
     $connection = mysql_connect($dbhost, $dbuser, $dbpass);
     mysql_select_db("mydatabase", $connection);
     $query1 = "SELECT * FROM ".$src;
     $ans1 = mysql_query($query1,$vitoquenId);
于 2019-11-18T11:54:53.343 に答える