Произвольный запрос на выборку с помощью MySQL и PHP на странице сайта

25 Июн
2012

Однажды вечером я решил написать «велосипед» на PHP.
В своей админке недоступной для других пользователей мне стала вдруг нужна такая страница, которая позволяла выполнение произвольного запроса на выборку на странице сайта.
Смысл был в том, чтобы я мог немедленно посмотреть со своего сайта интересующие меня события в базе, например, какие сообщения появились в какой-либо таблице… поскольку в phpMyAdmin каждый раз лазить, чтобы просто что-то посмотреть весьма утомляет. Ну вот решил сразу поделиться своими наработками сегодняшнего вечера…

В принципе для новичков в PHP это может будет полезно. Вообщем смотрите сами и прошу строго не судить…
И здесь я в коде не проверяю данные например функцией mysql_real_escape_string() и т.п., так как себе пока еще доверяю.

Ну а любителям и новичкам WordPress подсказываю: необязательно создавать шаблоны этой CMS — Вы можете создать для себя страницу в корне сайта, там где лежит файл wp-load.php. Именно он отвечает за соединение с базой и передает все функции Вордпресса на страницу. Одновременно можно проверить администратор или нет пытается зайти на страницу, и если это не админ послать его на 404 страницу:

<?php 
require( './wp-load.php' );
if ( !current_user_can("administrator") ) { 
        header("HTTP/1.1 404 Not Found");
        header("Location: 404");	
die();
}
?>


Дальше пишем шапочку, например так, чтобы было понятно что мы делаем:

<h2>Выполнение произвольного запроса</h2>
<p> Данный запрос выбирает из базы данные. </p>




Поехали!

Пишем нашу форму. Будем отправлять и обрабатывать методом POST в одном файле, поэтому action оставим пустым. Далее используем переменную DB_NAME — имя нашей базы данных и попытаемся получить от туда список таблиц
Здесь я привел, как вариант, работу цикла foreach в цикле while. Можно было и по другому, например через $row[0], ну а я попробовал такой вариант:

<?php	echo '<form action="" method="post">';
$res = mysql_query("SHOW TABLES FROM ".DB_NAME." ;");
if (!$res) {
    echo 'Ошибка при выполнении запроса: ' . mysql_error();
    exit;
}
?> 
Таблица: 	<select  name="tableq"> 
	<?php 
    while ($row = mysql_fetch_assoc($res)) {
		foreach ($row as $key => $value) {
			echo  '<option value="'.$value.'">'.$value.'</option>';
		}			
    }
	?>
	</select>		
<?php 
	echo '<p>Условие (необязательно):</p> поле <input type="text" name="whereq" >';
	echo ' содержит <input type="text" name="likeq" >';	
	echo '<br /><input type="submit" value="Выполнить"><br />';
	echo "</form>";	
}


Сразу оговоримся, что мы дадим себе возможность выбирать по условию «столбец содержит», чтобы не выводить сумасшедшее количество записей на страницу.

Далее пусть мы передаем локальную переменную окружения $_POST[‘tableq’] и тут же проверяем ее на существование, потом запросом выводим список столбцов в выбранной таблице и их количество:

IF (isset($_POST['tableq'])) {
$result = mysql_query("SHOW COLUMNS FROM ".$_POST['tableq']." ");
 if (!$result) {
    echo 'Ошибка при выполнении запроса: ' . mysql_error();
    exit;
 }
	if (mysql_num_rows($result) > 0) {
	$nums=mysql_num_rows($result);
		echo "В  таблице ".$_POST['tableq']." : ";
		while ($row = mysql_fetch_assoc($result)) {
			foreach ($row as $key => $value) {
				if  ($key == 'Field') { 
				$value .=  ", ";
				$vals = $vals.$value;
				$count++;			
				}
			}			
		}
	}	

	echo "<u>".$count. " столбцов ";
	echo $vals = substr($vals , 0, strlen($vals)-2 )."</u><br />\n";
}


Что дальше нам нужно, так это попробовать получить интересующие нас данные из таблицы. Выводить будем результаты построчно, а заодно проверим и $_POST[‘whereq’] и $_POST[‘likeq’], а если условие задано не будет, то выведем все данные из таблицы:

	if (!empty($_POST['whereq']) && !empty($_POST['likeq']) ) { 
	$result = mysql_query("SELECT * FROM ".$_POST['tableq']." WHERE ".($_POST['whereq'])." LIKE '%".($_POST['likeq'])."%' ");	
	} else {
	$result = mysql_query("SELECT * FROM ".$_POST['tableq']." ");
	}
	while ($row = mysql_fetch_row($result)) {
		for ($i = 0; $i < $count; $i++) {
		echo "  {$row[$i]} | \n";
		if ($i==$count-1) echo  "<br />\n";
		}
	}	



Все. Ниже оставляю полностью весь код:

IF (isset($_POST['tableq'])) {
$result = mysql_query("SHOW COLUMNS FROM ".$_POST['tableq']." ");
 if (!$result) {
    echo 'Ошибка при выполнении запроса: ' . mysql_error();
    exit;
 }
	if (mysql_num_rows($result) > 0) {
	$nums=mysql_num_rows($result);
		echo "В  таблице ".$_POST['tableq']." следующие записи: <br />\n";
		while ($row = mysql_fetch_assoc($result)) {
			//print_r($row);
			foreach ($row as $key => $value) {
				if  ($key == 'Field') { 
				//echo  $value."<br />\n";
				$value .=  ", ";
				$vals = $vals.$value;
				$count++;			
				}
			}			
		}
	}	

	echo "<u>".$count. " столбцов ";
	echo $vals = substr($vals , 0, strlen($vals)-2 )."</u><br />\n";
	
	if (!empty($_POST['whereq']) && !empty($_POST['likeq']) ) { 
	$result = mysql_query("SELECT * FROM ".$_POST['tableq']." WHERE ".($_POST['whereq'])." LIKE '%".($_POST['likeq'])."%' ");	
	} else {
	$result = mysql_query("SELECT * FROM ".$_POST['tableq']." ");
	}
	while ($row = mysql_fetch_row($result)) {
		for ($i = 0; $i < $count; $i++) {
		echo "  {$row[$i]} | \n";
		if ($i==$count-1) echo  "<br />\n";
		}
	}	



} ELSE {
	echo '<form action="" method="post">';
$res = mysql_query("SHOW TABLES FROM ".DB_NAME." ;");
if (!$res) {
    echo 'Ошибка при выполнении запроса: ' . mysql_error();
    exit;
}
?> 
Таблица: 	<select  name="tableq"> 
	<?php 
    while ($row = mysql_fetch_assoc($res)) {
		foreach ($row as $key => $value) {
			echo  '<option value="'.$value.'">'.$value.'</option>';
		}			
    }
	?>
	</select>		
<?php 
	echo '<p>Условие (необязательно):</p> поле <input type="text" name="whereq" >';
	echo ' содержит <input type="text" name="likeq" >';	
	echo '<br /><input type="submit" value="Выполнить"><br />';
	echo "</form>";	
}


Ну а допиливать велосипед если хотите — пробуйте сами. Можно и получше выполнить этот код, так что
пишите в комментариях свои примеры.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх