Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: автоматическое формирование таблицы
 
 автор: enodik   (02.03.2011 в 22:13)   письмо автору
 
 

подскажите, пожалуйста, каким образом можно организовать автоматический вывод таблицы по запросу.
Есть html файл, который содержит в себе текстовое поле, в которое пользователь вводит запрос (формат запроса: SELECT название полей FROM таблица)

<form action="1.php" method=POST>
Ответ<br>
<textarea name="otvet" cols=32 rows=5></textarea>
<input type=submit value="выполнить">
</form>


При нажатии на кнопку Выполнить данные из текстового поля заносятся в переменную $query файла 1.php. В итоге нужно вывести результат работы запроса в таблицу html с заголовками столбцов.




<?php
/* Соединяемся с базой данных */
$hostname = "localhost"; // путь сервера
$username = "root"; // имя пользователя
$password = ""; // пароль пользователя
$dbName = "bd_1"; // название базы данных

/* Создаем соединение */
mysql_connect($hostname, $username, $password) or die ("Не могу создать соединение");

/* Выбираем базу данных. Если произойдет ошибка - вывести ее */
mysql_select_db($dbName) or die (mysql_error());

/* Составляем запрос для извлечения данных из полей таблицы */
$query = $_POST["otvet"];
/* Выполняем запрос. Если произойдет ошибка - вывести ее. */
$res = mysql_query($query) or die(mysql_error());

/* Выводим данные из таблицы */

????????????


/* Закрываем соединение */
mysql_close();
?>

  Ответить  
 
 автор: cheops   (02.03.2011 в 22:20)   письмо автору
 
   для: enodik   (02.03.2011 в 22:13)
 

Так а что за данные вводятся в $_POST["otvet"] - что за таблица, какова её структура? Или необходимо вывести содержимое произвольной таблицы?

  Ответить  
 
 автор: enodik   (02.03.2011 в 22:29)   письмо автору
 
   для: cheops   (02.03.2011 в 22:20)
 

программа нечто обучающего теста по sql. есть структура базы данных и таблицы. студенту задается вопрос из разряда: "Напишите команду SELECT, которая бы вывела номер заказа, сумму, и дату для всех строк из таблицы Заказов".
студент вводит в текстовое поле ответ в формате: SELECT название полей FROM таблица.

ввести он может соответственно любые поля, и правильные и не правильные...

$_POST["otvet"] это как раз текстовый запрос который студент ввел в текстовое поле.

необходимо организовать вывод по этому запросу. заранее нельзя предугадать какие поля он введет.. если они есть в БД то выводится таблица, если их нет, то сообщение об ошибке.
если он ввел не верные поля, но они все равно есть должен вывестись его результат и правильный..

пока я застряла на месте автоматического вывода из таблицы заголовков полей и содержимого текстового запроса который студент ввел в текстовое поле, данные которого в $_POST["otvet"]

  Ответить  
 
 автор: Trianon   (02.03.2011 в 22:40)   письмо автору
 
   для: enodik   (02.03.2011 в 22:29)
 

Количество полей в SQL-отклике можно получить функцией mysql_num_fields()
Подробную информацию по каждому полю - функцией mysql_fetch_field()

Если, конечно, речь идет о MySQL.

  Ответить  
 
 автор: enodik   (03.03.2011 в 12:43)   письмо автору
 
   для: Trianon   (02.03.2011 в 22:40)
 

скажите, а как я могу обратиться к значению функции mysql_fetch_field(), чтобы вывести таблицу значений из БД?

<?php

/* Соединяемся с базой данных */
$hostname = "localhost"; // название/путь сервера, с MySQL
$username = "root"; // имя пользователя (в Denwer`е по умолчанию "root")
$password = ""; // пароль пользователя (в Denwer`е по умолчанию пароль отсутствует, этот параметр можно оставить пустым)
$dbName = "bd_1"; // название базы данных
/* Создаем соединение */
mysql_connect($hostname, $username, $password) or die ("Не могу создать соединение");
/* Выбираем базу данных. Если произойдет ошибка - вывести ее */
mysql_select_db($dbName) or die (mysql_error());

/* Составляем запрос для извлечения данных из полей таблицы */
$query = $_POST["otvet"];
/* Выполняем запрос. Если произойдет ошибка - вывести ее. */
$res = mysql_query($query) or die(mysql_error());

/* Выводим данные из таблицы */
for($i=0;$i<mysql_num_fields($res);$i++) {
$param=mysql_fetch_field($res);
if(!$param) echo "Ошибка!";
echo "<PRE>
name: $param->name
table: $param->table
</PRE>";
}
echo ("

<h3>Результат правильного выполнения упражнения:</h3>
<table border=\"1\" cellpadding=\"0\" cellspacing=\"0\">
<tr style=\"border: solid 1px #000\">
<td align=\"center\"><b>???????????</b></td>
</tr>
");

/* Цикл вывода данных из базы конкретных полей */
while ($row = mysql_fetch_array($res)) {
echo "<tr>\n";
echo "<td>".$row['??????????']."</td>\n";
}
/* Закрываем соединение */
mysql_close();
?>

  Ответить  
 
 автор: cheops   (03.03.2011 в 12:54)   письмо автору
 
   для: enodik   (03.03.2011 в 12:43)
 

Для этого нужно указать в качестве ключа $row название столбца.

  Ответить  
 
 автор: enodik   (03.03.2011 в 14:11)   письмо автору
 
   для: cheops   (03.03.2011 в 12:54)
 

спасибочки большое:) все получилось что хотела:)

  Ответить  
 
 автор: cheops   (02.03.2011 в 22:42)   письмо автору
 
   для: enodik   (02.03.2011 в 22:29)
 

В любом случае скармливать все, что ввел студент функции mysql_query() без предварительного анализа - плохая идея, да и с анализом тоже не очень (предусмотреть все достаточно сложно). Способный студент, вам в лучшем случае найдет таблицу с оценками с сразу себя 5 поставит, а в худшем - просто уничтожит базу данных. Скорее всего придется анализатор запросов писать, к реальной базе данных обучаемых лучше на пушечный выстрел не допускать. Достаточно забыть intval() и допустить SQL-инъекцию, чтобы злоумышленики шороху в базе данных навели, а тут вообще выполняются целые запросы...

  Ответить  
 
 автор: Trianon   (02.03.2011 в 22:49)   письмо автору
 
   для: cheops   (02.03.2011 в 22:42)
 

Что-то Вы сгущаете краски.
Можно же оценить количество одновременно тестируемых учеников, распределить для каждого по эккаунту с правами к одной развернутой БД.
Это если полная проверка, SQL и DML.

А если только SELECT так и вообще одной БД хватит.
И даже одного эккаунта.

  Ответить  
 
 автор: cheops   (02.03.2011 в 23:10)   письмо автору
 
   для: Trianon   (02.03.2011 в 22:49)
 

Если это свой сервер, с возможностью установки прав доступа для каждого аккаунта, тогда вопросов нет - сам стер - сам потом восстанавливай таблицу :))) А вот если дело происходит на виртуальном хостинге, тогда все написанное выше справедливо.

  Ответить  
 
 автор: Trianon   (02.03.2011 в 23:22)   письмо автору
 
   для: cheops   (02.03.2011 в 23:10)
 

На адекватных хостингах как создаваемые эккаунты, так и создаваемые БД также являются ресурсами, распределяемыми для клиента.
Решать же такую задачу в рамках бесплатного хостинга - дело гиблое.

Распределяемый эккаунт без возможности наделить его правами - как-то вообще нонсенс. Зачем он такой нужен?

Про одну БД я загнул, конечно.
Для тестирования SELECT-запросов достаточно двух БД, одна из которых тестовая, и двух эккаунтов, обычного с полными правами, и эккаунта с правами сугубо на SELECT сугубо к этой тестовой БД.

С DML-тестами придется запрашивать достаточное количество эккаунтов и БД. Ну и либо пропускная способность такого тестирующего портала окажется в пределах лимитов хостинга на эти ресурсы, либо придется брать VDS.
Что тоже реализуемо. И тоже, кстати, еще далеко не собственный сервер.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования