4

私のすべてのphpページに、次のdb接続コードを含めます

<?php
$dbInfo = parse_ini_file('path/to/ini/file');
define ("HOST", $dbInfo["HOST"]); // The host you want to connect to.
define("USER", $dbInfo["USER"]); // The database username.
define("PASSWORD", $dbInfo["PASSWORD"]); // The database password. 
define("DATABASE", $dbInfo["DATABASE"]); // The database name.

  $mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
// If you are connecting via TCP/IP rather than a UNIX socket remember to add the port number as a parameter.
if (mysqli_connect_error()) {
    die('fail');
} else {
  echo 'success';
}


If ((USER == "USERNAME HERE") || (PASSWORD == "PASSWORD HERE")){
  print 'ERROR - Please set up the script first';
    exit();
}
?>

私が何をしても(パスワードを間違えたり、ファイルへのパスを間違えたりするなど)、常に「成功」​​がエコーされます。オブジェクト指向の If($mysqli->connect_error) を使用して、新しい mysqli の前に @ を付けて、エラーに try/catch を使用してみました。私がすることは何も返されません

私が置くとき

echo 'Success... ' . $mysqli->host_info . "\n";

エコー成功の代わりに、私は得る

Success... Localhost via UNIX socket

この偽の成功メッセージが表示され続ける理由を誰か教えてもらえますか? 編集: 私が最後に探しているのは、開発に使用するようなすべての php エラー メッセージ (つまり、ini_set('display_errors',1);) ではなく、 If connection_error ステートメント。

Edit2: var_dump($mysqli); の結果 不正なファイル パスを使用している (parse_ini_file がファイルのない場所を指している)

object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(6) "5.5.32" ["client_version"]=> int(50532) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(23) "5.5.32-0ubuntu0.12.10.1" ["server_version"]=> int(50532) ["stat"]=> string(135) "Uptime: 8944 Threads: 1 Questions: 2445 Slow queries: 0 Opens: 275 Flush tables: 1 Open tables: 67 Queries per second avg: 0.273" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(468) ["warning_count"]=> int(0) } 

そして var_dump(mysqli_connect_error()); の結果

NULL

var_dump($mysqli); の結果 正しいファイル パスを使用する (テストおよび検証済み)

object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(6) "5.5.32" ["client_version"]=> int(50532) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(23) "5.5.32-0ubuntu0.12.10.1" ["server_version"]=> int(50532) ["stat"]=> string(136) "Uptime: 15306 Threads: 1 Questions: 2446 Slow queries: 0 Opens: 275 Flush tables: 1 Open tables: 67 Queries per second avg: 0.159" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(471) ["warning_count"]=> int(0) }

NULL

ご覧のとおり、正しいパスを parse_ini_file に入力したかどうか、またはファイルが存在しない偽の場所を指していたかどうかに関係なく、両方の var_dumps の結果は (稼働時間を除いて) 同じです。

編集 3: 質問に回答しました。自分の質問に答えるのに十分な時間が経過するまでコメントを見てください。

4

1 に答える 1

3

正しい方向に向けてくれたユーザー「Your Common Sense」に感謝します。

mysqli コンストラクトhttp://php.net/manual/en/mysqli.construct.phpのドキュメントによると、ホストが NULL または未定義の場合、パスワードが NULL または未定義の場合、デフォルトで localhost になります。

「MySQL サーバーは、パスワードのみを持たないユーザー レコードに対してユーザーを認証しようとします。」

そのため、偽のファイルの場所を指すたびに、パスワードを受け入れないユーザー名で localhost に接続しようとしました。残念ながら、Mysql はデフォルトで、グローバル アクセスとパスワードなし (使用権限のみ) を持つ 3 人のユーザーをインストールします。その結果、偽のファイルの場所が正常に接続されました。

解決策は、これら 3 人のユーザー (およびテスト データベース) を削除することでした。私は今、前述の方法を含むいくつかの方法を使用して失敗します

if (NULL !== mysqli_connect_error()) { 
  die('fail'); 
} else {
  echo 'success';
}

また

if (mysqli_connect_error()) {
    die('fail');
} else {
  echo 'success';
}

また

if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '. $mysqli->connect_error);
}
于 2013-09-20T12:09:04.190 に答える