Сегодня мне прислали посмотреть ...
***************************************
// ПРоверяем создана ли таблица, если нет - создаем
require_once("config.php");
$query = "SELECT * FROM users";
if (empty($query)) {
//SQL - запрос
$query = "CREATE TABLE users (
id_users INT(11) NOT NULL AUTO_INCREMENT,
name TINYTEXT NOT NULL,
pass TINYTEXT NOT NULL,
PRIMARY KEY (id_users))";
if (mysql_query($query)) {
echo"Таблица создана успешно";
}
}
//Удаляем лишние пробелы
$_POST['name'] = trim($_POST['name']);
$_POST['pass'] = trim($_POST['pass']);
$_POST['pass_again'] = trim($_POST['pass_again']);
// Проверка заполнения полей
if (empty($_POST['name'])) exit('Ваш логин, сэр');
if (empty($_POST['pass'])) exit('Ваш пароль, сэр');
if (empty($_POST['pass_again'])) exit('На какой-то из паролей вызабили, сэр');
if ($_POST['name'] != $_POST['pass_again']) exit('Пароли не совпадают, сэр');
//Проверка на уникальность
require_once("config.php");
$query = "SELECT COUNT(*) FROM users WHERE name = '$_POST[name]'";
$usr = mysql_query($query);
if (!$usr) exit("Ошибка - " . mysql_error());
$total = mysql_result($usr, 0);
if ($total > 0) {
exit("Данный логин уже существует...");
}
// Добавляем нового пользователя
$query = "INSERT INTO users
VALUES(NULL,
'$_POST[name]',
'$_POST[pass]')";
mysql_query($query);
// Удалить / Редактировать//
//Создаем таблицу
$query = "SELECT * FROM users";
$usr = mysql_query($query);
if (!$usr) exit("Ошибка - " . mysql_error());
if (mysql_num_rows($usr) > 0) {
echo "";
echo "
№
Логин
";
$i = 0;
while ($users = mysql_fetch_array($usr)) {
echo "
$users[id_users]
$users[name]
";
$i++;
}
echo "";
echo "";
echo "";
}
// Удаление
if (!empty($_POST)) {
$temp = array();
foreach ($_POST['users'] as $id_users) {
if (preg_match("|^[\d]+$|", $id_users)) {
$temp[] = $id_users;
}
}
$query = "DELETE FROM users WHERE id_users IN (" . implode(",", $temp) . ")";
*************************************
ну что ж - посмотрим ... на это кхм-кхм - безобразие :))
// ПРоверяем создана ли таблица, если нет - создаем
$query = "SELECT * FROM users";
if (empty($query)) {
//SQL - запрос
$query = "CREATE TABLE users (
id_users INT(11) NOT NULL AUTO_INCREMENT,
name TINYTEXT NOT NULL,
pass TINYTEXT NOT NULL,
PRIMARY KEY (id_users))";
if (mysql_query($query)) {
echo"Таблица создана успешно";
}
}
о чём нужно думать, чтобы проверять на то - существует ли таблица или нет? :)
Это можно использовать если вдруг мы будем писать установщик для какой-нить массовой системы ...
ну а так - мы ведь пишем под себя, 100% знаем что база есть - нафига делать лишнее телодвижение. (это имхо)
А теперь про безобразие:
// ПРоверяем создана ли таблица, если нет - создаем
$query = "SELECT * FROM users";
я точно не знаю, как работает БД, но предполагаю, что когда мы делаем запрос к ней - то она выполняет его - и нашу выборку сохраняет в ОЗУ ....
представим что у нас 10к пользователей, каждый заполнил параметры "о себе" и т.д. ... в общем полный букет всего ...
и что мы делаем вот этим: "SELECT * FROM users" ? Выбираем всё-всё-всё, что есть в таблице users ... и ради чего? ради того - что проверить существует таблица или нет? Не смешите :)
если уж хочется добавить таблицу (на всяк случай) если не существует - то юзайте sql запрос:
http://phpclub.ru/mysql/doc/create-table.html
(CREATE TABLE IF NOT EXISTS tbl_name)
***
идём дальше:
//Удаляем лишние пробелы, // Проверка заполнения полей
молодец :)
//Проверка на уникальность
require_once("config.php");
нафига? я понимаю что не приинклудится конфиг ... но и зачем это надо, если оно уже у нас есть?
$query = "SELECT COUNT(*) FROM users WHERE name = '$_POST[name]'";
у нас логин уникальный? так?
А почему нет уникального индекса для этого поля в БД? :)
когда используете WHERE в запросе без сортировок и группировок - индексы и уникальные индексы облегчат жизнь процессору и ему не придётся искать по всей базе в 10к пользователей и он остановится при 1-м найденном пользователе (т.к. он будет знать, что запись с таким логином уникальна) ...
но не вздумайте под лозунгом "есть индексы - это хорошо, нет индексов - плохо" ставить индексы на каждое поле, т.к. они замедляют добавление, редактирование, удаление в БД ...
в общем читаем и мотаем на ус:
http://ru.wikipedia.org/wiki/Sparse_index
( name TINYTEXT NOT NULL )
почему TINYTEXT, а не varchar? для текстовых записей нет индексов ... не мучайте базу данных :)
// Добавляем нового пользователя
$query = "INSERT INTO users
VALUES(NULL,
'$_POST[name]',
'$_POST[pass]')";
не ленитесь указать те поля, которые хотите добавить ... ну т.е. вот так:
$query = "INSERT INTO users (name, pass) VALUES('$_POST[name]', '$_POST[pass]')";
т.к. если вдруг вы потом добавите по просьбе заказчика ещё одно незначащее поле, которое не надо добавлять в этом запросе ... и так 10 раз, и так в нескольких таблицах и нескольких местах ...
проклянёте всё на свете, когда будете бегать по всем скриптам и искать куда же вставить добавление пустоты ('') ... и не говорите потом, что я вас не предупреждал :)
***
$i = 0;
while ($users = mysql_fetch_array($usr)) {
echo "
$users[id_users]
$users[name]
";
$i++;
}
так и не понял - нафига тут $i )))))
echo "";
echo "";
echo "";
wtf? ) Помните, что echo - это вывод на экран и работает она "долго"...
потом, когда это будет более важно - кину линк (если найду) на журнал php inside - там была интересная статья по поводу оптимизации скриптов и что сколько и как выполняется ... но это так - на будущее (или если сильно интересно - можете сами найти).
****
// Удаление
if (!empty($_POST)) {
$temp = array();
foreach ($_POST['users'] as $id_users) {
if (preg_match("|^[\d]+$|", $id_users)) {
$temp[] = $id_users;
}
}
$query = "DELETE FROM users WHERE id_users IN (" . implode(",", $temp) . ")";
mysql_query($query);
}
("Ни хрена не получается...
Точнее, предволагаю, что $_POST уже имеет даные отличные от $id_users пробовал post заменить на get ошибок не выдает но и логины из таблицы не удаляет..." - комментарий автора в асе)
я так и не понял что ты тут делал ... здесь какой-то бред, либо ты не понял что я от тебя хотел :)
post может передаваться либо через форму, либо ручками программиста вставляется в заголовок, отправляемый серверу ...
чтобы что-то удалить из базы - вот самый примитив:
if ( !empty($_GET['id']) ) {
mysql_query("DELETE FROM users WHERE id_users = $_GET[id]");
}
$query = mysql_query("SELECT id_users FROM users");
while ($users = mysql_fetch_array($query)) {
echo "<а href="?id=$users[id_users]">Удалитьа>
";
}
.....................................
P.s.
$query = "SELECT * FROM users";
$usr = mysql_query($query);
если будете писать скрипты "для меня" - в смысле чтобы мне показать - пишите вот так:
$query = mysql_query("SELECT * FROM users");
т.е. чтобы в $query уже был результат выполнения SQL (просто я так привык - и мне так наглядней ...)
праймари кей называйте id для каждой таблицы (а не id_users), ведь он у вас будет один, и мы 100% будем знать, что id - это то что нам надо ... и писать короче :))
(я так привык ... плохо / хорошо - хз ... но ... стандартны в данном блоге - я задаю :))
На это вроде всё.
что я могу сказать? - не дурно, очень не дурно для человека, который ещё вчера совсем ничего не знал про mysql ...
P.s.s. бляха-муха ... гугл сука режет пхп скрипты ... уже задрался редактировать %)
ненавижу, когда боты вмешиваются в мою ручную работу )
P.s.s.s. если будут вопросы - с ними ко мне в асю, комменты читаю (если они есть :)) только к предыдущему посту, когда собираюсь написать новый ... и всё.
среда, 3 марта 2010 г.
Подписаться на:
Комментарии к сообщению (Atom)
Куча ошибок :)
ОтветитьУдалитьНо это вообще ржач :))
if ($_POST['name'] != $_POST['pass_again']) exit('Пароли не совпадают, сэр');
Хотя у некоторых пользователей оно совпадет
на самом деле в нашей системе могут регистрироваться только те, у кого совпадают ...
ОтветитьУдалитьвот такая вот мудрёная защита от роботов и НЕ блондинок =)