PDA

Просмотр полной версии : Краткий мануал по PHP + MySQL


Hast
15.01.2009, 23:30
Дело было ночью, делать было нечего... Решил написать мануал, который думаю поможе каждому начинающему программисту, который хочет познакомиться с mysql.

Этот краткий мануал поможет начинающим программистам, которые хотят научиться писать подобные системы, а так же обучиться основам синтаксиса и использования mysql в php. Я не буду углубляться в тонкости php и mysql, я всего лиш попытаюсь дать вам базовые знания используя их вы со временем уже сами сможете усовершенствовать свои знания.

Внимание! Мануал предназначен только для ознакомления с mysql и помогает новичкам понять алгоритм построения систем управления пользователями. Использовать его в рабочих проектах крайне не рекомендуется

Итак, чтобы вы поняли основу построения сиетем управления пользователями и получили базовые знания mysql, я на примерах расскажу вам как реализовать следующии функции:

- Регистрация пользоваталей (добавление данных в таблицу)

- Авторизация пользователей (выборочное получение данных с таблицы, использование сессий)

- Получение списка всех пользователей (массовое получение данных из таблицы, сортировка и вывод на экран)

- Поиск пользователей (поиск по базе)

- Редактирование/удаление профиля (редактирование/удаление полей в таблице)

Для начала, советую вам ознакомиться с функциями, которые будут использованы в данном мануале при работе с mysql:

mysql_connect() (http://ua.php.net/manual/en/function.mysql-connect.php)

mysql_select_db() (http://ua.php.net/manual/en/function.mysql-select-db.php)

mysql_query() (http://ua.php.net/manual/en/function.mysql-query.php)

mysql_num_rows() (http://ua.php.net/manual/en/function.mysql-num-rows.php)

mysql_fetch_assoc() (http://ua.php.net/manual/en/function.mysql-fetch-assoc.php)

mysql_error() (http://ua.php.net/manual/en/function.mysql-error.php)

Первое что нужно сделать - это подключиться к базе данных (в дальнейшем БД) и создать таблицу пользователей с определённой структурой.

Для этого создадим 2 файла: config.php и create_table.php

файл config.php будет служить нам для подключения к БД и хранения данных для подключения.

Текст файла config.php:

<?php

$db_server = "localhost"; // сервер mysql (в 90% случаев это localhost)
$db_user = "root"; // пользователь бд
$db_password = ""; // пароль этого пользователя
$db_name = "test"; // название бд

mysql_connect($db_server, $db_user, $db_password) or die(mysql_error()); // подключаемся к бд с нашим именем пользователя и паролем, или выводим ошибку в случае неудачи
mysql_select_db($db_name) or die(mysql_error()); // выбираем бд для дальнейшей работы с ней, или выводим ошибку в случае неудачи

?>

Если всё сделано правильно, то, запустив этот скрипт в браузере, вы должны получить чистую страницу.

Теперь создадим в нашей базе таблицу users. Для этого нам нужно выполнить mysql запрос. Синтаксис создания таблицы имеет примерно такой вид:

CREATE TABLE `имя_таблицы` (
`поле 1` параметры поля,
`поле 2` параметры поля,
`поле 3` параметры поля,
параметры таблицы);

Для выполнений mysql запросов в php используется функция mysql_query().

Итак, текст файла create_table.php:

<?php

require_once 'config.php'; // Присоеденям файл config.php для подключания к БД

// Заносим в переменную $query текст запроса

$query = "CREATE TABLE `users` (
`id` INT(11) NOT NULL auto_increment,
`login` VARCHAR(15) NOT NULL default '',
`password` VARCHAR(32) NOT NULL default '',
`info` TEXT NOT NULL default '',
PRIMARY KEY (`id`)
);";

mysql_query($query) or die(mysql_error()); // Выполняем запрос или выводим ошибку в случае неудачи

echo "Table created successful!"; // Если таблица была успешно создана выводим надпись Table created successful!

?>

Объясню назначения параметров, использующихся при создании данного запроса.

INT, VARCHAR, TEXT - тип поля (цифра в скобках после типа определяет максимальную длину поля)
NOT NULL - не является неопределённостью.
default - стандартное значение поля (в данном случае все поля изначально пустые)
auto_increment - автоматическое заполнение поля. При каждом заполнении таблицы значение этого поля будет увеличиваться на 1
PRIMARY KEY - первичный ключ. Первичный ключ определяет уникальность строки, и препятствует вводу повторяющихся данных в это поле. В данном случае, это поле `id`.

Теперь запустите скрипт через браузер. Если всё сделано правильно вы должны увидеть на экране Table created successful!

Теперь, когда таблица создана, можем перейти к основной части.

Сейчас попытаемся сделать регистрацию пользователей. Для начала создадим файл reg.php. Теперь мысленно представим себе структуру скрипта:

1) рисуем ХТМЛ форму.
2) если форма была заполнена и отправлена на сервер, проверяем введённые данные на валидность.
3) если ошибок не обнаружено, заполняем таблицу users используя полученные данные, в противном случае выводим сообщение об ошибке.

Сразу скажу, что пароли в таблице в открытом виде храниться не будут. В таблице будет храниться мд5 хеш пароля.

Синтаксис запроса для занесения данных в таблицу имеет несколько видов. Я советую пользоваться вам вот таким:

INSERT INTO `имя таблицы` (
`поле 1`, `поле 2`, `поле 3`
) VALUES (
'значение поля 1', 'значение поля 2', 'значение поля 3')

Текст файла reg.php:

<?php

require_once 'config.php'; // Присоединям файл config.php для подключения к БД

$result = ""; // Объявляем переменную $result в которой будет храниться сообщение об ошибке либо об успешной регистрации

// Если на сервер переданы POST переменные, обрабатываем их

if ($_POST['register'] == "1")
{
if ( ($_POST['login'] == "") || ($_POST['password'] == "")) || ($_POST['info'] == "") ) // проверяем заполнены ли все поля
{
$result = "Заполните все поля";
}
else if ( (strlen($_POST['login']) < 3) || (strlen($_POST['login']) > 15) ) // проверяем длину поля login
{
$result = "Длина логина не должна быть меньше 3 и больше 15 символов";
}
else if ( (strlen($_POST['password']) < 5) || (strlen($_POST['password']) > 15) ) // проверяем длину поля password
{
$result = "Длина логина не должна быть меньше 5 и больше 15 символов";
}
else
{
// для удобства объявляем переменные $login $password и $info и присваиваем им полученные значения.

$login = $_POST['login'];
$password = md5($_POST['password']); // Присвояем переменной $password мд5 хеш поля password
$info = $_POST['info'];

// Заносим в переменную $query текст запроса

$query = "INSERT INTO `users` (
`login`, `password`, `info`
) VALUES (
'$login', '$password', '$info')";

mysql_query($query) or die(mysql_error()); // Выполняем запрос или выводим ошибку в случае неудачи

$result = "Пользователь зарегистрирован успешно!"; // присваиваем переменной $result сообщение об успешной регистрации
unset($_POST); // Обнуляем массив $_POST
}
}

// Рисуем HTML форму.

?>

<html>
<head>
<title></title>
</head>
<body>
<?=$result ?> <br>
<form method=post>
<input type="hidden" name="register" value="1">
Имя <input type="text" name="login" value="<?=$_POST['login'] ?>"><br>
Пароль <input type="text" name="password" value="<?=$_POST['password'] ?>"><br>
Ифно <textarea name=info wrap=soft><?=$_POST['info'] ?></textarea><br>
<input type="submit" name="" value="Зарегистрироваться"><br>
</form>
<a href="index.php">На главную</a>
</body>
</html>

Тестируем, смотрим таблицу через, например, майадмин. Если юзер появился - всё сделано правильно.

Следующий шаг - авторизация пользователей. Для этого создадим файл index.php. Логика скрипта очень простая:

1) Если есть пост данные ищем пользователя в таблице с таким же именем и паролем. Если он обнаружен - объявляем новую сессионную переменную и в качестве значения присваеваем ей id этого пользователя и редиректим на тот же index.php.
2) Если пользователь не обнаружен, выводим сообщение о неудачной авторизации.
3) Если же пост данных нет, просто чекаем наличие сессии. Если сессия есть - Показываем закрытую страницу. Если же нет - рисуем форму авторизации.

Кто не знает, сессия - это серверная кука, которая живёт до конца таймаута, указанного в настройках и которую нельзя переприсвоить непосредственно с клиентской стороны. Для того что бы использовать сессии, в начале каждого скрипта должна присувствовать ф-ция session_start() (http://ua.php.net/manual/ru/function.session-start.php)

Запрос выбора данных строится так:

SELECT `имя поля` FROM `имя таблицы` WHERE `поле 1`='значение 1' and `поле 2`='поле 2' LIMIT 1

- знак * после слова SELECT означает что нужно выбрать все поля
- в sql запросах можно использовать только словесные обозначения AND и OR. Знаки &&(и) и ||(или) здесь работать не будут
- При сравнении могут использоваться следующие операторы: = (равно), > (больше), < (меньше), >= (больше или равно), <= (меньше или равно), < > (больше или меньше (оператор != в sql запросах не используется))
- LIMIT 1 означает что результат нужно ограничить лиш одной строкой

Текст файла index.php:

<?php

session_start(); // Объявляем функцию session_start() которая должна присувствовать в начале каждого скрипта для работы с сессиями.

require_once 'config.php'; // Присоеденям файл config.php для подключания к БД

$result = ""; // Объявляем переменную $result в которой будет храниться сообщение об ошибке либо об успешной авторизации

if ($_POST['auth'] == 1) // Если на сервер переданы данные с формы
{
$login = $_POST['login']; // переменной $login присваивам значение полученного логина.
$password = md5($_POST['password']); // переменной $password присваивам значение мд5 хеша полученного пароля.

// Строим запрос, в котором нужно в таблицы users найти пользователя с таким же логином и паролем.
// Заносим в переменную $query текст запроса

$query = "SELECT * FROM `users` WHERE `login`='$login' and `password`='$password' LIMIT 1";
$result_query = mysql_query($query) or die(mysql_error()); // Выполняем запрос и присваиваем переменной $result_query результат выполненного запроса, или выводим ошибку в случае неудачи
$num = mysql_num_rows($result_query); // функция mysql_num_rows() возвращает число строк, полученных при выполнении запроса.

if ($num == 1) // Если mysql вернул 1 строку, что означает что пользователь с таким логином и паролем найден
{
$row = array(); // Объявляем массив $row...
$row = mysql_fetch_assoc($result_query); // и заполняем его данными, полученными их таблицы.
$_SESSION['user_id'] = $row['id']; // объявляем новую сессионную переменную и в качестве значения присваеваем ей id этого пользователя...
header("Location: index.php"); // и редиректим его на тот же index.php
}
else
{
$result = "Неверное имя пользователя или пароль"; // Присваиваем переменной $result сообщение об ошибке
}
}

if (isset($_SESSION['user_id'])) // Если сессия есть, что означает что пользователь авторизирован, выводим закрытую страницу
{

$result = $_SESSION['user_id']; // Присваиваем переменной $result значение сессии user_id которая содержит id пользователя

?>

<html>
<head>
<title></title>
</head>
<body>
Привет! Твой id - <?=$result ?>! <br>
<a href="list.php">Список пользователей</a> <br>
<a href="search.php">Поиск пользователей</a> <br>
<a href="edit.php">Изменить данные</a> <br>
<a href="delete.php">Удалить себя :)</a> <br>
<a href="logout.php">Выйти</a> <br>
</body>
</html>

<?php

}
else // А если сессии нет, рисуем форму авторизации
{
?>

<html>
<head>
<title></title>
</head>
<body>
<?=$result ?><br>
<form method=post>
<input type="hidden" name="auth" value="1">
Имя <input type="text" name="login" value="<?=$_POST['login'] ?>"><br>
Пароль <input type="password" name="password" value="<?=$_POST['password'] ?>"><br>
<input type="submit" name="" value="Войти"><br>
</form>
<a href="reg.php">Регистрация</a>
</body>
</html>

<?php
}

?>

Теперь, что бы сделать выход пользователя, создайте файл logout.php. Файл очень простой - удаляем сессию, редиректим на index.php

Текст файла logout.php:

<?php

session_start(); // Объявляем функцию session_start() которая должна присувствовать в начале каждого скрипта для работы с сессиями.

session_destroy(); // Удаляем все сессии

header("Location: index.php"); // и редиректим пользователя на страницу авторизации index.php

?>

Осталось реализовать изменение и удаление данных, массовый вывод информации из таблицы и поиск по бд.

Сначала сделаем самое простое - поиск пользователей по логину. Создайте файл search.php Запрос поиска формируется так:

SELECT `имя поля` FROM `имя таблицы` WHERE `имя поля` LIKE '%значение%'

- Знак % означает любой символ

тут всё просто:

1) проверяем, есть ли ПОСТ-данные
2) если есть, ищем в таблице users
3) рисуем форму поиска

текст файла search.php:

<?php

session_start(); // Объявляем функцию session_start() которая должна присувствовать в начале каждого скрипта для работы с сессиями.

if (!$_SESSION['user_id']) { header("Location: index.php"); } // Если сессии нету, тоесть пользователь не авторизирован - редиректим его на страницу авторизации

require_once 'config.php'; // Присоеденям файл config.php для подключания к БД

if ($_POST['search'] == 1) // Если на сервер переданы данные с формы
{
$login = $_POST['login']; // переменной $login присваивам значение полученного логина.

// Строим запрос, в котором нужно в таблице users найти строку, в котором часть поля login совпадает с полученными данными
// Заносим в переменную $query текст запроса

$query = "SELECT * FROM `users` WHERE `login` LIKE '%$login%'";
$result_query = mysql_query($query) or die(mysql_error()); // Выполняем запрос и присваиваем переменной $result_query результат выполненного запроса, или выводим ошибку в случае неудачи
$num = mysql_num_rows($result_query); // функция mysql_num_rows() возвращает число строк, полученных при выполнении запроса.

if ($num > 0) // Если найдено больше нуля записей
{
// Теперь нам нужно в один массив занести несколько массивов с полученными записями из таблицы
$row = array(); // Объявляем массив $row в котором будут храниться массивы с данными конкретной записи
$rows = array(); // Объявляем массив $rows в котором будут храниться массивы со всеми записями

// С помощью цикла заносим в массив $row даные данной записи, после чего добавляем этот массив к массиву $rows
while ($row = mysql_fetch_assoc($result_query))
{
$rows[]= $row;
}
// Выводим результат на экран с помощью цикла foreach
?>

<html>
<head>
<title></title>
</head>
<body>
Всего найдено <?=$num ?> записей! <br>
<table border=1>
<?php foreach ($rows as $row) { ?>
<tr>
<td><?=$row['login'] ?></td>
</tr>
<?php } ?>
<table><br>
<form method=post>
<input type="hidden" name="search" value="1">
Поиск: <input type="text" name="login" value=""><br>
<input type="submit" name="" value="Искать"><br>
</form>
<a href="index.php">На главную</a>
</body>
</html>

<?php
}
else // Если поиск результатов не дал, выводим сообщение об ошибке
{
?>

<html>
<head>
<title></title>
</head>
<body>
Ничего не найдено<br>
<form method=post>
<input type="hidden" name="search" value="1">
Поиск: <input type="text" name="login" value=""><br>
<input type="submit" name="" value="Искать"><br>
</form>
<a href="index.php">На главную</a>
</body>
</html>

<?php
}
}
else // если нет переданных на сервер данных, рисуем пустую форму
{
?>
<html>
<head>
<title></title>
</head>
<body>
<form method=post>
<input type="hidden" name="search" value="1">
Поиск: <input type="text" name="login" value=""><br>
<input type="submit" name="" value="Искать"><br>
</form>
<a href="index.php">На главную</a>
</body>
</html>
<?php
}

?>

Теперь создадим файл list.php в котором будет выводиться список всех пользователей.

Структура скрипта не сильно отличается от скрипта поиска, поэтуму, думаю, пояснять тут нечего.

Текст файла list.php:

<?php

session_start(); // Объявляем функцию session_start() которая должна присувствовать в начале каждого скрипта для работы с сессиями.

if (!$_SESSION['user_id']) { header("Location: index.php"); } // Если сессии нету, тоесть пользователь не авторизирован - редиректим его на страницу авторизации

require_once 'config.php'; // Присоеденям файл config.php для подключания к БД


// Строим запрос, в котором нужно в таблицы users выбрать все записи
// Заносим в переменную $query текст запроса

$query = "SELECT * FROM `users`";
$result_query = mysql_query($query) or die(mysql_error()); // Выполняем запрос и присваиваем переменной $result_query результат выполненного запроса, или выводим ошибку в случае неудачи
$num = mysql_num_rows($result_query); // функция mysql_num_rows() возвращает число строк, полученных при выполнении запроса.

if ($num > 0) // Если найдено больше нуля записей
{
// Теперь нам нужно в один массив занести несколько массивов с полученными записями из таблицы
$row = array(); // Объявляем массив $row в котором будут храниться массивы с данными конкретной записи
$rows = array(); // Объявляем массив $rows в котором будут храниться массивы со всеми записями

// С помощью цикла заносим в массив $row даные данной записи, после чего добавляем этот массив к массиву $rows
while ($row = mysql_fetch_assoc($result_query))
{
$rows[]= $row;
}
// Выводим результат на экран с помощью цикла foreach
?>

<html>
<head>
<title></title>
</head>
<body>
Всего в таблице <?=$num ?> записей! <br>
<table border=1>
<?php foreach ($rows as $row) { ?>
<tr>
<td><?=$row['login'] ?></td>
</tr>
<?php } ?>
<table><br>
<a href="index.php">На главную</a>
</body>
</html>

<?php
}
else // Если mysql_num_rows вернул 0 лаписей, что означает что пользователей в таблице нет - выводим сообщение об ошибке
{
?>

<html>
<head>
<title></title>
</head>
<body>
Пользователей в таблице не обнаружено<br>
<a href="index.php">На главную</a>
</body>
</html>

<?php
}
?>

Следующий, предпоследний шаг - изменение данных в таблице. Точнее, мы будем изменять логин и пароль пользователей. Создадим файл edit.php

Запрос изменения данных в таблице выглядит так:

UPDATE `имя таблицы` SET `поле 1`='значение 1', `поле 2`='значение 2' WHERE `поле 3`='значение 3'

Логика скрипта простая:

1) проверяем, есть ли ПОСТ-данные
2) изменяем значения полей в таблице
3) рисуем форму

Тут тоже, надеюсь, всё понятно.

Текст файла edit.php:

<?php

session_start();

require_once 'config.php'; // Присоеденям файл config.php для подключания к БД

if (!$_SESSION['user_id']) { header("Location: index.php"); } // Если сессии нету, тоесть пользователь не авторизирован - редиректим его на страницу авторизации

$result = ""; // Объявляем переменную $result в которой будет храниться сообщение об ошибке либо об успем изменении

// Если на сервер переданы POST переменные, обрабатываем их

// Получаем данные пользователя из базы
// Строим запрос, в котором нужно в таблице users найти пользователя, id которого равен сессии user_id (тоесть того пользователя, который сейчас находится на сайте)
// Заносим в переменную $query текст запроса
$query = "SELECT * FROM `users` WHERE `id`='{$_SESSION['user_id']}' LIMIT 1";
$result_query = mysql_query($query) or die(mysql_error()); // Выполняем запрос и присваиваем переменной $result_query результат выполненного запроса, или выводим ошибку в случае неудачи
$row = array(); // Объявляем массив $row...
$row = mysql_fetch_assoc($result_query); // и заполняем его данными, полученными их таблицы.

if ($_POST['edit'] == "1")
{
if ( ($_POST['login'] == "") || ($_POST['info'] == "") ) // проверяем заполнены ли все поля
{
$result = "Заполните все поля";
}
else if ( (strlen($_POST['login']) < 3) || (strlen($_POST['login']) > 15) ) // проверяем длину поля login
{
$result = "Длина логина не должна быть меньше 3 и больше 15 символов";
}
else
{
// для удобства объявляем переменные $login и $info и присваиваем им полученные значения.

$login = $_POST['login'];
$info = $_POST['info'];

// Заносим в переменную $query текст запроса

$query = "UPDATE `users` SET `login`='$login', `info`='$info' WHERE `id`='{$_SESSION['user_id']}' LIMIT 1";

mysql_query($query) or die(mysql_error()); // Выполняем запрос или выводим ошибку в случае неудачи

$result = "Данные успешно изменены! (что бы увидеть результат, обновите страницу)"; // присваиваем переменной $result сообщение об успешнои изменении данных
}
}

// Рисуем HTML форму.

?>

<html>
<head>
<title></title>
</head>
<body>
<?=$result ?> <br>
<form method=post>
<input type="hidden" name="edit" value="1">
Имя <input type="text" name="login" value="<?=$row['login'] ?>"><br>
Ифно <textarea name=info wrap=soft><?=$row['info'] ?></textarea><br>
<input type="submit" name="" value="Изменить"><br>
</form>
<a href="index.php">На главную</a>
</body>
</html>

Ну и наконец создаём последний файл delete.php.

Наверное это самый лёгкий скрипт из всех :) Структура запроса удаления записи в таблице:

DELETE FROM `имя таблицы` WHERE `поле 1`='значение 1'

Логика скрипта:

1) удаляем пользователя
2) Уничтожаем все сессии и выводим на экран сообщение об удачном удалении пользователя.

Текст файла delete.php:

<?php

session_start();

require_once 'config.php'; // Присоеденям файл config.php для подключания к БД

if (!$_SESSION['user_id']) { header("Location: index.php"); } // Если сессии нету, тоесть пользователь не авторизирован - редиректим его на страницу авторизации

// Строим запрос, в котором нужно в таблице users удалить запись, id которого равен сессии user_id (тоесть того пользователя, который сейчас находится на сайте)
// Заносим в переменную $query текст запроса
$query = "DELETE FROM `users` WHERE `id`='{$_SESSION['user_id']}' LIMIT 1";
$result_query = mysql_query($query) or die(mysql_error()); // Выполняем запрос и присваиваем переменной $result_query результат выполненного запроса, или выводим ошибку в случае неудачи

// Так как пользователя теперь нет, сессия ему уже не понадобится :)

session_destroy(); // Удаляем все сессии

// И выводим на экран сообщение об успешном удалении пользователя с сылкой на страницу авторизации index.php

?>

<html>
<head>
<title></title>
</head>
<body>
Пользователь успешно удалён!<br>
<a href="index.php">На страницу авторизации</a>
</body>
</html>

Поздравляю! Вы освоили построение базовых sql запросов, которые вам будут нужны на протяжении всей вашей крьере программиста.

Всем спасибо. Надеюсь, этот мануал действительно кому-то поможет :)

Искрене ваш, Hast.

ЧаВо:


В: Что такое sql-инъекция:
О: Материал из Википедии — свободной энциклопедии

Внедрение SQL-кода (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.

подробнее здесь (http://ru.wikipedia.org/wiki/SQL_%D0%B8%D0%BD%D1%8A%D0%B5%D0%BA%D1%86%D0%B8%D1% 8F)

В: Как защититься от sql-инъекций?
О: Нужно экранировать спец символы в полученных данных. Для этого существуют функции mysql_escape_string() (http://ua2.php.net/mysql_escape_string), addslashes() (http://ua2.php.net/manual/ru/function.addslashes.php) и другие.

В: А как быть если в настройках сервера включена опция magic quotes gpc? Ведь получится двойное экранирование
О: Существует 3 способа:

1) Проверять текущее состояние magic quotes функицей get_magic_quotes_gpc() (http://ua2.php.net/manual/ru/function.get-magic-quotes-gpc.php) и в зависимости от результата валидировать или не валидировать данные

2) Вырубать magic quotes с помощью ini_set('magic_quotes_gpc', 0); Но такое решение работает только в том случае, если в настройках сервера включена возможность изменять настройки с помощью скриптов.

3) Жестоко вырубать magic quotes в .htaccess'e: php_flag magic_quotes_gpc off

В: Как организовать поиск не по точному совпадению строки $string, а по её вхождению в таблице?
О: Вот так:

"SELECT * FROM `table_one` WHERE `field_one` LIKE '%".$string."%'"

где % - любой(ые) символ(ы)

В: Как с помощью одного запроса выбрать данные из нескольких таблиц?
О: Вот так:


SELECT t1.*, t2.* FROM `table1` AS t1, `table2` AS t2


В: А что если в обоих таблицах есть колонка с одинаковым названием, и значение обоих колонок мне нужно получить?
О: Нужно насильно задать уникальное имя колонки при выборке:


SELECT t1.name AS t1_name, t2.name AS t2_name FROM `table1` AS t1, `table2` AS t2




UPDATE: Мануал обновил, учёл все замечания и пожелания.

По всем вопросам и предложениям по улучшению мануала или фака — ко мне в ЛС (http://forum.igromania.ru/private.php?do=newpm&u=146209).

P1ece
16.01.2009, 00:22
Ну неплохо. Гуд. Новисам сойдет

adVISeR
16.01.2009, 01:22
PHP код ужасен чуть более чем полностью, вот народ начитается такого, и начнёт писать "индийский код"...
Особо улыбнули "or" в стиле Паскаля ))
сессия - это серверная кука, которая живёт до закрытия окна браузера
Бред, живёт она до конца таймаута, который указан в настройках.

P.S. Новая тема врятли нужна, по крайней мере в таком виде, лучше оформить в виде сообщения в теме про php, на которое будет ссылка в первом посте.
Так что либо оформляем в соотвествии с заголовком(php код всё равно не качественный), либо переезжаем в тему о php.

Hast
16.01.2009, 13:58
чем именно он ужасен? :) Можно конкретнее? :) Насчёт or/and - просто привык так писать. Особой разницы не вижу.

adVISeR
16.01.2009, 15:01
чем именно он ужасен?
Тем, что народ сейчас начнёт его везде использовать и писать свои "мега CMS", которые будут дохнуть от простой SQL инъекции.

require_once
Это не функция, а конструкция языка.
Правильная запись:
require_once "file.php";

Условия в if/while нужно отделять скобками.
php - С-подобный язык, поэтому смешение синтаксиса очень не желательно. Эти вещи оставили скорее для "совместимости с программистами".

просто привык так писать
Есть такая штука, как стандарты. Иногда полезно почитать.
Для примера, можно глянуть вот это http://www.reg.ru/coding_standards
Если вам доведётся работать над чем-то в комманде, то поймёте зачем нужны стандарты..

Я конечно понимаю, что это всё написано ради примера, но "учебники" должны быть
правильными полностью, иначе учиться по ним нельзя.

Hast
16.01.2009, 16:12
Тем, что народ сейчас начнёт его везде использовать и писать свои "мега CMS", которые будут дохнуть от простой SQL инъекции.
Ну, если прочитав 3-й абзац моего первого поста кто то не поймёт о чём там идёт речь - это уже далеко не мои проблемы :) Я предупредил, пхп код тут для примера, главная задача мануала - помоч понять новисам построение sql запросов. А то, КАК они будут использовать эти запросы и какой при этом использовать код пусть решают сами. Если бы были проблемы именно в sql - то другое дело. А так...

Ну, да, я согласен, некоторые пренибрежения стандартами и спорные моменты в коде есть. Но разве из-за этого его нужно называть ужасным? http://govnokod.ru/php вот это - да, вот это ужас. Я разумеется не считаю себя сверх граммотным программистом, это далеко не так. Но всё равно не думаю что мой код можно назвать ужасным :horse:

A&D
16.01.2009, 16:58
Hast

NOT NULL - не является нулём

Не является неопределенностью

adVISeR
16.01.2009, 17:01
код тут для примера
Собственно можно было обойтись и без него, раз уж мануал по MySQL только.
Заголовок поменял. В важное тему крепить не буду, в шапке темы по PHP ссылку оставлю.
Тему пока не закрываю. Посмотрим что из этого выйдет.

P1ece
16.01.2009, 17:26
Условия в if/while нужно отделять скобками.
Спорно кстати. Я много вижу утверждений на тему

if ($a>$b){echo "Превед";}

говнокодерством, мол надо писать

if ($a>$b)echo "Превед";

Или ты не про это? А именно про

if ($a<$b)

adVISeR
16.01.2009, 17:36
Спорно кстати.
По стандартам многих контор, нужно помимо скобок ещё чётко отделять пробелами, т.е что-то вроде:
if ( ($a > $b) && ($b > $c) )
Или ты не про это?
И про это тоже.

_figer_
25.09.2009, 21:27
я в sql полный 0 да и faq этот немного устарел ( ссылки не работают)
разъясните пожалуйста как конектиться к своему же серверу БД. в faq которым я пользовался было сказано настроить в SQL Server Configuration Manager порт своего Tcp/ip но увы я при установленном sql нашел только Client Network Utility в котором можно настроить порт Tcp/ip но при входе в SQL Server Management Studio Express (и вводе там своих данных и пароля при установки) мне говорится что конечный компьютер отверг подключение.
пользуюсь sql 2005

V@s3K
26.09.2009, 11:56
faq этот немного устарел ( ссылки не работают)
Заменить в ссылках /ru/ на /en/ и читать.

Hast
26.09.2009, 12:38
faq этот немного устарел ( ссылки не работают)
исправил

разъясните пожалуйста как конектиться к своему же серверу БД
В первом же пункте (сразу после ссылок) описано как подключиться к БД.

OneHalf
22.02.2010, 00:30
Есть ли какой-нибудь простой метод получить id (поле с автоинкрементом) только что добавленной записи?
Что-нибудь типа
SELECT id FROM (INSERT INTO (a, b, c ) VALUES (1, 2, 3))
Или чего-то подобного?

adVISeR
22.02.2010, 00:37
OneHalf
http://ru2.php.net/manual/en/function.mysql-insert-id.php
Если конечно я правильно вопрос понял %)

OneHalf
25.02.2010, 01:37
Да, Правильно. Спасибо.

Еще вопрос:
Есть у меня поле такого вида:

"Type"
set('Курсовые', 'Методички', 'Лекции', 'Билеты/Задачи/Вопросы', 'Решения типовиков/задач', 'Учебники/книги', 'Лабораторные', 'Программы', 'Прочее')

Тобишь множество из допустимых значений. Мне не очень хочется дублировать это в html, переписывая варианты, и хотелость бы из php создать список для <select> (или набора <input type="checkbox">) с допустимыми вариантами (а то я возможно буду еще менять этот тип). Подскажите, пожалуйста, как это лучше реализовать?
Заранее спасибо.

V@s3K
25.02.2010, 19:39
Подскажите, пожалуйста, как это лучше реализовать?
Циклом. Как же еще?
Или взять готовую реализацию из любого фреймворка, если знать где лежит.

OneHalf
25.02.2010, 20:20
Дык как вынуть это из типа поля?
В phpMyAdmin это выглядит так:
http://i026.radikal.ru/1002/55/4965cde22663.png
Я хочу узнать, как получить этот список из php. В принципе я может и статичным текстом этот список впихну на страничку, но хотелось бы знать, как выполнить и такой вариант

V@s3K
25.02.2010, 20:49
В phpMyAdmin это выглядит так:
А, так оно в БД. Не признал.
Ня: http://dev.mysql.com/tech-resources/articles/mysql-set-datatype.html

OneHalf
28.02.2010, 21:51
У меня очередная проблема:
Есть две таблицы Files и Subjects
Обращение к ним такого типа:

SELECT Files.*, Subjects.Title FROM Files
LEFT JOIN Subjects ON Files.SubjId = Subjects.id

Проблема в том, что в каждой таблице есть поле Title, а я не знаю, как обращаться к конкретному полю (Доступно только значение второго поля).
Можно ли как-нибудь получить оба значения, или обязательно нужно переименовать поля?

Hast
28.02.2010, 22:08
SELECT Files.*, Subjects.Title AS subj_title

И это, кстати, в шапке есть.

cmexxx
12.03.2011, 11:18
Тем, что народ сейчас начнёт его везде использовать и писать свои "мега CMS", которые будут дохнуть от простой SQL инъекции.

Подскажите, тогда плиз как обезопасить от SQL инъекции этот код? или хотя бы как писать, чтобы с этой точки зрения было верно?
Просто очень много слов было написано о том, что код кривой, хотя, признаться, я и сам бы так написал (в плане алгоритма и запросов)
Хотелось бы, как новичку, увидеть правильно исполнение, изложенного автором сабжа, кода=)))

adVISeR
12.03.2011, 11:39
cmexxx
Если кратко, то нужно проверять и фильфтровать данные, после получения их из суперглобальных массивов. Нельзя данные из форм пихать в запросы сразу.

cmexxx
12.03.2011, 18:07
Вы случайно не имеете ввиду использование массивов $HTTP_POST_VARS и $HTTP_GET_VARS ?
кстати раз уж зашала речь о безопасности ведь можно еще огрничивать длину вводимых пользователем данных (это что касается инъекций через формы)
Другое дело когда инъекции через адресную строку... вот тут хотелось бы услышать дополнительные разъяснения от людей сведущих)))

Hast
12.03.2011, 18:54
Вы случайно не имеете ввиду использование массивов $HTTP_POST_VARS и $HTTP_GET_VARS ?
$_POST и $_GET, не?


кстати раз уж зашала речь о безопасности ведь можно еще огрничивать длину вводимых пользователем данныхИ что с того будет? Ведь форма - не единственный способ, которым можно передать POST-запрос. Его можно передать и напрямую, в обход веб-интерфейса. Поэтому ВСЯ валидация входящих данных должна осуществляться на сервере.

И да, в шапке, в разделе ЧаВо есть описание самых базовых мер безопасности.

cmexxx
12.03.2011, 19:23
$_POST и $_GET, не?
Нет, насколько я знаю,м вышеуказанные массивы передают свои параметры в адресной строке а это не есть хорошо

И что с того будет? Ведь форма - не единственный способ, которым можно передать POST-запрос.
Никто не спорит) но ведья я-то речь веду не об этом)
Напрямую-это вы имеете ввиду через адресную строку?
Вот с этим я и хочу разобраться

Hast
12.03.2011, 20:02
Нет, насколько я знаю,м вышеуказанные массивы передают свои параметры в адресной строке а это не есть хорошо
Где вы этого бреда набрались? $HTTP_POST_VARS содержит теже самые данные, что и $_POST с одним лишь отличием - массив $HTTP_POST_VAR, в отличии от $_POST, не является суперглобальным. Тоже самое для $_GET и $HTTP_GET_VARS


Напрямую-это вы имеете ввиду через адресную строку?
Через адресную строку передаются только $_GET параметры. $_POST данные передаются серверу уже в теле запроса (в заголовке указывается только размер передаваемых данных). Тебе никто не мешает написать свой http-клиент (да хоть на том же php через curl) и передавать запросы прямо на сервер.

cmexxx
12.03.2011, 20:43
ну вот и разобрались))) я новичок в этом, поэтому и спрашиваю, что не понятно)
благо что есть, кому объяснить)

Рыцарь
16.03.2011, 22:59
Объясните, пожалуйста, совсем понять не могу: с помощью каких СУБД можно создать распределённую базу данных? Задал этот вопрос здесь, поскольку здесь идёт речь и о MySQL.

A&D
17.03.2011, 14:27
Рыцарь,
Вот тут хорошая статья с примерами на Oracle - посмотри
http://citforum.ru/database/kbd96/45.shtml

Рыцарь
17.03.2011, 15:13
A&D, спасибо за статью.
А MySQL относится к распределённым БД?

De-Luxis
27.03.2011, 12:54
Подскажите, тогда плиз как обезопасить от SQL инъекции этот код?
что-то типа такого может уже защитить от sql инекций:

$res = mysql_query("SELECT что-то FROM таблица WHERE id = {0} AND act = {1}",array($_POST['id'],$_POST['act']));
Это пример.

А в основном конечно:
Если кратко, то нужно проверять и фильфтровать данные
К тому же обязательно пишите в пыхэпе с выключенным register_globals
;)
А MySQL относится к распределённым БД?
Бери PostgreSQL. Не ошибешься.

shopman
13.08.2016, 18:25
Это какая версия PHP? начинаю изучать сейчас PHP поэтому многие советовали сразу начать с 7-ой версии. Кто что думает по этому поводу? Может какая книга есть стоящая чтобы без ошибок код можно было написать.

A&D
21.09.2016, 14:07
shopman,
Актуальные версии 5.6 и 7.0
Документацию можно смотреть здесь http://php.net/docs.php

Pravilo92
13.05.2018, 14:16
Конечно лучше с 7, ведь это самое новое обновление, а зачем тебе уже 5.2 или 5.3? Если они себя изжили и их ломают на раз.