#php #mysql #mysqli
#php #mysql #mysqli
Вопрос:
Что у меня есть:
У меня есть таблица в MySQL с именем «обновления», которая в настоящее время содержит следующую информацию:
Что мне нужно:
Что мне нужно, так это следующее:
Что я сделал до сих пор:
У меня есть следующий запрос MySQL, который работает:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(Date = ''',
Date,
''', Description, NULL)) AS ',
CONCAT("'",Date,"'")
)
) INTO @sql
FROM updates;
SET @sql = CONCAT('SELECT Action, ', @sql, ' FROM updates GROUP BY Action');
PREPARE stmt FROM @sql;
EXECUTE stmt;
Актуальный вопрос
Я не могу понять, как выполнить это с помощью PHP, чтобы я мог отобразить этот вывод на веб-странице. Кто-нибудь может либо предоставить мне PHP-код для выполнения этого, либо указать мне правильное направление требуемой информации.
Я прочитал несколько статей, но я думаю, что проблема в том, что я не знаю, что я на самом деле ищу. Сначала я предположил, что это способ запуска подготовленных операторов в PHP, но, похоже, это не помогло.
Комментарии:
1. Всегда ли количество столбцов фиксировано?
2. Забудьте вопрос, как вы сгенерировали эту таблицу? : D
3. Какой из них? Вторая таблица? Если это так, я просто запускаю свой последний раздел кода, который я опубликовал в MySQL. ПРИМЕЧАНИЕ: это не работает в phpmyadmin, его необходимо запускать из командной строки MySQL.
Ответ №1:
Предполагая, что вы используете mysqli (а не PDO), вы не можете использовать простой запрос (), потому что вы хотите выполнить несколько команд. Вам нужно будет использовать multi_query() в сочетании с store_result(), more_results() и next_result() .
Вот некоторый код, который я использовал однажды:
$db=mysqli_connect($databasehost,$databaseuser,$databasepass,$databasename) or die ("Connection failed!");
$result = $db->multi_query($sql);
if ($err=mysqli_error($db)) { echo $err."<br><hr>"; }
if ($result) {
do {
if ($res = $db->store_result()) {
echo "<table width=100% border=0><tr>";
// printing table headers
for($i=0; $i<mysqli_num_fields($res); $i )
{
$field = mysqli_fetch_field($res);
echo "<td bgcolor=lightgray><b>{$field->name}</b></td>";
}
echo "</tr>n";
// printing table rows
while($row = $res->fetch_row())
{
echo "<tr>";
foreach($row as $cell) {
if ($cell === NULL) { $cell = '(null)'; }
echo "<td>$cell</td>";
}
echo "</tr>n";
}
$res->free();
echo "</table>";
}
} while ($db->more_results() amp;amp; $db->next_result());
}
$db->close();
Комментарии:
1. Похоже, это именно то, что мне нужно для проверки созданной страницы. Однако я получаю следующее сообщение об ошибке: Предупреждение: mysqli_num_fields() ожидает, что параметр 1 будет mysqli_result, логическое значение, заданное в C:wampwwwActionPlanupdates.inc.php в строке 60
2. @Petay87 Привет, странно, что я не понял этого раньше. ДА. $result является логическим значением в случае multi_query() . Возможно, это осталось от моего примера с одним запросом (). Если вы измените
$result
in$res
в части// printing table headers
, она должна работать лучше (я думаю). (изменено в ответе)
Ответ №2:
Это немного кода, как получить доступ к базе данных с помощью MySQLI, если это может вам помочь
<?php
$servername = "hostIP";
$username = "lescours_username";
$password = "password of the data base";
$dbname = "lescoursDB";
//Create connection
$conn = new mysqli($servername, $username, $password);
if ($conn->connect_error) {
echo "La connexion au serveur a etez interompu, Merci d'essayez plus tard";
}else{
$sql = 'SELECT nom FROM uiotable where nom= '' . $nom_ut . ''';
//$numRows = $result0->num_rows;
if (!$conn->query($sql)) {
echo "Nom d'utilisteur incorrecte ";return;
}else
{ $result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
$row = $result->fetch_assoc();
echo $row["mo_pas"];
}
}
?>
Ответ №3:
Ответ прост. Вы всегда можете запускать каждый запрос из своего набора как отдельный вызов query() . это универсальное правило для выполнения операторов с несколькими запросами.
$mysqli->query('SET @sql = NULL');
$mysqli->query(<<<HERE
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(Date = ''',
Date,
''', Description, NULL)) AS ',
CONCAT("'",Date,"'")
)
) INTO @sql
FROM updates;
HERE
);
$mysqli->query("SET @sql = CONCAT('SELECT Action, ', @sql, ' FROM updates GROUP BY Action');");
$mysqli->query("PREPARE stmt FROM @sql");
$res = $mysqli->query("EXECUTE stmt");
var_dump($res->fetch_all(MYSQLI_ASSOC));
но, пожалуйста, помните, что с помощью такого запроса вы, по сути, выполняете SQL-инъекцию в свою собственную базу данных. Пока тип поля date
равен, он не может причинить никакого вреда, но для любого типа текста — будьте осторожны!