1. ホーム
  2. php

[解決済み] PHPでmysqli_query()を使用する方法は?

2022-03-13 19:17:31

質問

私はPHPでコーディングしています。以下のようなmySQLのテーブルを持っています。

CREATE TABLE `students` (
  `ID` int(10) NOT NULL AUTO_INCREMENT,
  `Name` varchar(255) DEFAULT NULL,
  `Start` int(10) DEFAULT NULL,
  `End` int(10) DEFAULT NULL,
   PRIMARY KEY (`ID`)
 ) ENGINE=InnoDB;

を使おうとしているのですが mysqli_query 関数を使用して、テーブルを DESCRIBE しています。

以下は私のコードです。

$link = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DATABASE);
$result = mysqli_query($link,"DESCRIBE students");

ドキュメントには SELECT、SHOW、DESCRIBE あるいは EXPLAIN クエリに成功すると、 mysqli_query() は次のような結果を返します。 mysqli_result オブジェクトを作成します。

しかし、そこからどのように印刷すればいいのかわかりません。 $result クエリ結果を表示するようにします。可能であれば、$resultを次のように表示したいです。

+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| ID       | int(10)      | NO   | PRI | NULL    | auto_increment |
| Name     | varchar(255) | YES  |     | NULL    |                |
| Start    | int(10)      | YES  |     | NULL    |                |
| End      | int(10)      | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+ 

もう一つの疑問は、クエリをどのように表示するかです。 SHOW CREATE TABLE students .

$result = mysqli_query($link,"SHOW CREATE TABLE students");

解決方法は?

認めざるを得ない。 mysqli_query() のマニュアルには、複数行を取得する方法についての明確な例はありません。おそらく、このルーチンがあまりに日常的で、何十年も前からPHPの人たちに知られていたためでしょう。

$result = $link->query("DESCRIBE students");
while ($row = $result->fetch_assoc()) {
    // to print all columns automatically:
    foreach ($row as $value) {
        echo "<td>$value</td>";
        // OR to print each column separately:
        echo "<td>",$row['Field'],"</td><td>",$row['Type'],"</td>\n";
    }
}

列のタイトルを表示したい場合は、まずデータを入れ子配列に選択し、最初の行のキーを使用する必要があります。

// getting all the rows from the query
// note that handy feature of OOP syntax
$data = $link->query("DESC students")->fetch_all(MYSQLI_ASSOC);
// getting keys from the first row
$header = array_keys(reset($data));
// printing them
foreach ($header as $value) {
    echo "<td>$value</td>";
}
// finally printing the data
foreach ($data as $row) {
    foreach ($row as $value) {
        echo "<td>$value</td>";
    }
}

ホストによっては fetch_all() 関数を使用します。そのような場合は $data の配列は、通常の方法で作成します。

$data = [];
$result = $link->query("DESC students");
while ($row = $result->fetch_assoc())
{
    $data[] = $row;
}

2つの重要な注意事項を付け加えました。

  1. mysqliの各ステートメントに対して手動でエラーをチェックするのではなく、自動的にエラーを投げるように設定する必要があります。これを行うには、次の行を追加します。 前に mysqli_connect() :

     mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    
    
  2. 最も重要な注意点 とは異なり mysql_query() , mysqli_query() は非常に限られた用途にしか使えません。この機能を使用できるのは クエリで変数が使用されない場合。 もし、PHPの変数が使われるのであれば、決して mysqli_query() を使用し、常に 準備されたステートメント を、このようにします。

     $stmt = $mysqli->prepare("SELECT * FROM students WHERE class=?");
     $stmt->bind_param('i', $class);
     $stmt->execute();
     $data = $stmt->get_result()->fetch_all();
    
    

ちょっと言葉足らずなところがありますね。コードの量を減らすには、PDOを使うか、あるいは シンプルなヘルパー関数 で、prepare/bind/executeのすべての処理を内部で行う。

$sql = "SELECT * FROM students WHERE class=?";
$data = prepared_select($mysqli, $sql, [$class])->fetch_all();