Я кодирую в 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 в PHP для 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 = mysqli_query($link,"DESCRIBE students"); while ($row = $result->fetch_assoc()) { foreach($row as $value) echo "<td>$value</td>"; }
Если вы хотите печатать заголовки столбцов, сначала необходимо выбрать свои данные в вложенном массиве, а затем использовать ключи первой строки:
// 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 = array(); $result = mysqli_query($link,"DESC students"); while ($row = $result->fetch_assoc()) { $data[] = $row; }
Вы должны сделать ошибки mysqli автоматически, вместо того, чтобы проверять их для каждого оператора 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();
Должен признаться, это немного многословие. Итак, для повседневного использования вместо использования функций mysqli
как есть, нужно принять какую-то оболочку, которая будет скрывать весь повторяющийся код внутри. Есть много оберток, но, конечно, я считаю, что мой собственный лучший ^ _ ^. Он называется Safemysql, и он позволит вам писать безопасный и сжатый код сразу:
$data = $db->getAll("DESCRIBE ?n", $table);
Но если вы не любите использовать сторонние библиотеки, тогда придерживайтесь PDO.