среда, 3 марта 2010 г.

Контроль работы

Сегодня мне прислали посмотреть ...

***************************************


// ПРоверяем создана ли таблица, если нет - создаем
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. если будут вопросы - с ними ко мне в асю, комменты читаю (если они есть :)) только к предыдущему посту, когда собираюсь написать новый ... и всё.

2 комментария:

  1. Куча ошибок :)

    Но это вообще ржач :))
    if ($_POST['name'] != $_POST['pass_again']) exit('Пароли не совпадают, сэр');

    Хотя у некоторых пользователей оно совпадет

    ОтветитьУдалить
  2. на самом деле в нашей системе могут регистрироваться только те, у кого совпадают ...

    вот такая вот мудрёная защита от роботов и НЕ блондинок =)

    ОтветитьУдалить