2012-01-16 8 views
1

私はPHPの論理比較に関するドキュメントを読んでいますが、この文脈でどのようにコードが関連しているのか分かりません。私はMySQLに接続する際に問題があると思っていましたが、すべてがうまくいくことが分かり、問題なくクエリを作成できます。だから、MySQLは実際にこの記事に関連するものではありません。PHPオペランドとオペレータに関係なく、PHPの比較は常にtrue

私はこれを使用して、建設中に接続しようとしたオブジェクトのエラーを報告します。私は==、===、!=と!==を試してみると、同じ問題が発生することに注意してください。私はboolとbooleanに引数をキャストしようとしました。

以下のコードブロックのコメントは関連しています。

private function assert($test){ // Tried renaming in case PHP was funny about it. 
    if ($test === FALSE){ // Tried ==, ===, !== and != and casting $test. 
     if ($this->use_exception){ 
      throw new mysql_exception(); 
     }else{ 
      die("MySQL ".mysql_errno()." - ".mysql_error()); 
     } 
    } 
} 

接続が一般的です。

$this->con = mysql_connect($host, $un, $pw, false, $ssl ? MYSQL_CLIENT_SSL : 0); 

// I get 'yay' 
echo mysql_ping($this->con) ? "yay" : "nay"; 

// This disagrees. Tried no cast, and a cast to bool. 
$this->assert((boolean)($this->con != FALSE)); 

mysql_ping()はすべてが正常だと言っていますが、assert()は何があってもプレスを停止します。

私はすべてのオペレーターとキャストの組み合わせを試してみました。名前の矛盾を越えてパラノイアから機能を改名しました。なぜassert()は真にしか見えないのですか?

EDIT:

は私の問題をより明確にするために、IS_RESOURCEのオイゲンの提案を使用して代替の実装を検討してください。問題は、なぜ私は以下のことが起こっているのか分かりません。

private function assert($test){ 
    $test = $test ? true : false; 
    if ($test === FALSE){ 
     echo "$test === false<br />"; 
    } 
    if ($test == FALSE){ 
     echo "$test == false<br />"; 
    } 
    if ($test !== FALSE){ 
     echo "$test !== false<br />"; 
    } 
    if ($test == FALSE){ 
     echo "$test != false<br />"; 
    } 
} 

比較結果が出力されず、値が変更されました。私はクエリを作ることができるので、$ testは真でなければなりません。私は出力を得るべきではありませんが、私はすべての演算子のために行います。私もFALSEを0に置き換えて試しました。

悪いPHPインスタンス?

1 !== false 
=== false 
!== false 
!= false 
+0

を考えていますか? – MrGlass

+1

'mysql_ping'から' yay'を取得します。これは '$ this-> con'が実際には' FALSE'ではないことを意味します。 '$ this-> con!= FALSE'は' true' 。 – Mchl

+1

だから何が問題なの?私があなたの投稿から理解しているように、接続は成功し、関数はリンク識別子を返します。 L.E .:マニュアルは「成功すればMySQLリンク識別子を返し、失敗した場合はFALSEを返します。だからあなたは 'if($ this-> con === FALSE)' – Catalin

答えて

0
$this->assert(is_resource($this->con)); 
+0

貢献してくれてありがとう!私はこの行を試しましたが、結果は同じです:assert()は引数を解釈するためにどのように指示するかにかかわらずスクリプトをまだ殺します。 –

+0

OPに新しい例を追加しました。 –

0

あなたはあなたの第二の例を使用し、機能を組み合わせることはできませんか?あなたは既に値(イェーイ/いや)

$this->con = mysql_connect($host, $un, $pw, false, $ssl ? MYSQL_CLIENT_SSL : 0); 
$this->assert = mysql_ping($this->con) ? 1 : 0; 

はちょうどあなたが$テストとして何を渡している大声

+0

assertが何かをする関数でない限り。申し訳ありませんが、私が間違っていてassertがブール値のデータポイント以上のものです。 – Silvertiger

+0

あなたのコードを見ると、$ this-> __setのためのプロパティをアサートすることを意味しますか?$ this-> connect()の値をチェックするには、別のメソッドでエラーチェックをしたいので、クラス定義を通してdie()、mysql_error()、mysql_errno()を実行する必要はありません。編集:はい、それは方法です。 –

+0

あなたのコードでは、$ this-> assertが0または1のブール値になることを期待していますか?私のコードは、あなたが "if($ assert){mysqlqueryと同類}"を追加することができるトリックを行う必要があります... ... assertはあらかじめ定義された関数またはメソッドではないですか?上記のコードを見ると、私のコード行と同様の機能を実行するためのassert関数を定義しています。 – Silvertiger

関連する問題