0

説明を得るために考えられるすべてを読みましたが、何も役に立たないようです。誰かが明らかなことを指摘したり、何が間違っているのかを少し教えてくれるかもしれません。私はphp.netとmysqliタグを読みましたが、これを理解できないようです。私が読んだものはすべて、2 つのクエリを送信できないと言っていますが、試しているのは 1 つだけです。どんな助けでも大歓迎です。

This-> https://stackoverflow.com/a/9649149/1626329 - おそらく複数の結果セットがあると述べていますが、それがあまり意味をなさないか、準備されたステートメントの内部動作の詳細を取得するために何ができるかはわかりません.

私のコード:

class mydb {

    public function __construct() {
        // Connect to Database
        $this->mydb = new mysqli('****', '***', '***', '***');
        if ($this->mydb->connect_errno) { // Error on connection failure
            echo "Failed to connect to MySQL in Construct: (" . $this->mydb->connect_errno . ") " . $this->mydb->connect_error;
        }
    }

    public function choose ($select, $from, $config = 0, $options = NULL) {
        if ($config === 0) { /** Configure statement for prepare depending on options */
            $stmt = 'SELECT ' . $select . ' FROM ' . $from;
        } elseif ($config === 1) {
            $stmt = 'SELECT ' . $select . ' FROM ' . $from . ' WHERE ' . $options['where_comp'] . ' LIKE ?';
        } elseif ($config === 2) {
            $stmt = 'SELECT ' . $select . ' FROM ' . $from . ' WHERE ' . $options['where_comp'] . ' = ?';
        } /** End if/elseif Prepare statemenet */
        $mydb = $this->mydb->prepare($stmt);
        if ($config === 1 || $config === 2) {
            $mydb->bind_param("s",$options['where_value']);
        }

        if ($mydb->execute()) { /** If execute is good then get results */
            $result = $mydb->get_result();
            $payload = array();
            while ($row = $result->fetch_array(MYSQLI_NUM)) {
                $payload[] = $row;
            }
            return $payload;
        } /** End if results */
    } /** End choose class method */
} /** End mydb Class */

$myDB = new mydb();

$agentArray = $myDB->choose('*','`agent`');

php.net の例を使用し、より良い例を示すように変更しました。

$mysqli = new mysqli('host', 'database', 'user', 'pass');
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

if (!($stmt = $mysqli->prepare("SELECT ? FROM ?"))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}

if (!($res = $stmt->get_result())) {
    echo "Getting result set failed: (" . $stmt->errno . ") " . $stmt->error;
}

for ($row_no = ($res->num_rows - 1); $row_no >= 0; $row_no--) {
    $res->data_seek($row_no);
    var_dump($res->fetch_assoc());
}
$res->close();
4

2 に答える 2

1

このページの「関連」セクションの最初の結果 (質問を書くのに苦労しているときに提供されたことを意味します)は、解決策を提供します

原則として、エラー メッセージに基づいて質問に対する回答を見つけるのは非常に簡単です。必要なのは、最初の検索結果にとどまらず、もう少し先に進むことだけです。

しかし、choose()あなたのこの機能について。私はそれが非常に非現実的で、安全でなく、役に立たないと思います:

  • SQL を使用することはできませんが、SQL の非常に限られたサブセットであるため、実用的ではありません。
    • また、コードが非常に理解しにくくなります。
  • すべての動的部分に対して保護を提供しないため安全ではありませんが、価値がある場合のみ
  • 混乱するほど節約できるので役に立たない.

ほら、あなたは 2 つの単語を節約したと思います -SELECTFROM.

 $agentArray = $myDB->choose('*','`agent`',1,
               array('where_comp' => 'name', 'where_value' -> "%bob%"));

それでも、このコードは理解しにくく、維持しにくく、最も単純な JOIN を実行できません。なぜそれをしないのですか。言うまでもなく、実際のコードは従来の SQL クエリよりも長くなります。

$sql = 'SELECT * FROM `agent` WHERE name LIKE ?';
$agentArray = $myDB->query($sql, "%bob%");

どちらが読みやすいですか?

于 2013-08-09T07:17:07.793 に答える
-1

エラーを正しく表示するために if ステートメントを追加すると、実際に使用できる mysql エラー応答が得られます。

if (!($stmt = $mysqli->prepare("SELECT ? FROM ?"))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

エラー応答: Prepare failed: (1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

-- 準備済みステートメントを介して識別子を渡すことはできず、ユーザー入力から渡された値に対してのみ使用する必要があります。

于 2013-08-09T22:09:29.550 に答える