0

そのクラスの1つを読み込むアプリケーションがあります。

public function __construct()
{
  global $config;
  //Establish a connection to the database and get results set
  $this->db = new Database("localhost",$config["dbuser"],$config["dbpass"],"student");
  $this->records = $this->db->query("SELECT * FROM major") or die("ERROR: ".$this->db->error);
  echo "<pre>".var_dump($this->records)."</pre>";
}

私の問題は、var_dump showsそれ$this->recordsがブール値であるということです。ドキュメントを読み、SELECTクエリが結果セットを返す必要があることを確認しました。これは、アプリケーションで使用される唯一のクエリです。

DBクラス:

  class Database
  {
      private $con;

     public function __construct($server,$user,$password,$database)
     {
        $this->con = new mysqli($server,$user,$password,$database) or die ("FATAL ERR: ".mysqli_error());
     }

    public function query($qry)
   {
     if(!isset($this->con)) die("ERROR: YOU ARE TRYING TO QUERY BEFORE THE CONNECTION IS ESTABLISHED!");
     return $this->con->query($qry) or die("FATAL ERROR:".$this->con->error);
   }
}

私が間違っているアイデアはありますか?

4

3 に答える 3

3

それは正しくありません。代入演算子(=)は、リテラルの「または」演算子よりも優先順位が高くなります。||(" "よりも優先順位が高い""演算子と混同しないでください=。)

にはバグがあるようですmysqli::query()。これにより、selectステートメントでまれにブール値の「true」が返されます。(有効な戻り値は、ブール値の「false」またはmysqli_resultオブジェクトになります。)

その主張について私を信じる必要はありません。PHPシェルで簡単に試すことができます。

$a = false or true;
var_dump($a);

結果:

bool (false)

これは、上記の割り当てが次と同等であるためです。

($a = false) or true;
于 2016-10-14T09:15:04.830 に答える
0

この質問の問題は、mysqli_query()関数ではなく、演算子の優先順位に関連しています。

そこでは、=演算子は演算子よりも優先されORます。つまり、代入は前に実行されますOR(この動作については、他の回答、mysqliまたはdieで詳しく説明しましたが、死ぬ必要がありますか?

問題の行は

 return $this->con->query($qry) or die("FATAL ERROR:".$this->con->error);

ここで、return演算子は(明らかな理由で)可能な限り低い優先順位を持っています。最初にPHPが論理演算子を実行し、次にその結果(ブール値)を返すことを意味します。

しかし、論理演算子の実行が原因でスクリプトが実際に終了しないのはなぜですか?

そのため、上記のリンクによる回答で説明されている論理演算子の実行の最適化が行われます。PHPは、実際に右端の演算子を実行する必要はありません。左端の値がすでに評価されているだけで十分です。trueつまり、式全体がtrueどちらの方法でも返されます。

この問題を解決するには、関数のコードを次のように変更する必要があります。

public function query($qry)
{
    $ret = $this->con->query($qry) or trigger_error($this->con->error);
    return $ret;
}

一方、呼び出し元のコードは単純に変更する必要があります

$this->records = $this->db->query("SELECT * FROM major");
echo "<pre>".var_dump($this->records)."</pre>";

falseエラーを2回チェックしても意味がないため、この関数が-like値を返すことはありません。

于 2016-10-16T19:00:56.780 に答える
-1

答えは、いわゆるマジックメソッドにあります。PHPの魔法のメソッドの1つは、__ debugInfo()と呼ばれます。このMagicメソッドが定義されている場合、var_dumb(obj)を呼び出すと、関数が出力するように指示したものがすべて出力されます。これは通常、親クラスのプライベート関数と保護された関数を非表示にするために行われます。

于 2016-10-15T20:03:26.083 に答える