[解決済み] PHPでmysqli_query()を使用する方法は?
質問
私は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つの重要な注意事項を付け加えました。
-
mysqliの各ステートメントに対して手動でエラーをチェックするのではなく、自動的にエラーを投げるように設定する必要があります。これを行うには、次の行を追加します。 前に
mysqli_connect()
:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
-
最も重要な注意点 とは異なり
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();
関連
-
[解決済み] [Solved] Fatal error: メンバ関数bind_param()のbooleanに対する呼び出し [重複] [重複
-
[解決済み】Apache + PHPで「ヘッダの前にスクリプトの出力が終了する」件
-
[解決済み] $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] PHPのエラーを表示させるにはどうしたらいいですか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】SQLSTATE[42000]: 構文エラーまたはアクセス違反が発生しました。1064 SQL 構文にエラーがあります - PHP - PDO [重複]。
-
[解決済み】空の配列要素を削除する
-
[解決済み】「初期通信パケットの読み込み」でMySQLサーバーに接続できなくなり、システムエラーになる。0
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: バインドされた変数の数が102行目のトークンの数と一致しない [終了]
-
[解決済み】「Fatal error: Class 'MySQLi' not found "を解決するには?
-
[解決済み】警告:mysql_fetch_array()はパラメータ1がリソースであることを期待、ブール値は[重複]で与えられる]
-
[解決済み】メッセージ。Trying to access array offset on value of type null [重複]配列のオフセットにアクセスしようとしています。
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?
-
[解決済み] MySQLデータベースのテーブルのスキーマを表示するにはどうすればよいですか?