Форум Игромании
 
Регистрация
Справка

Программирование Создание, разработка и доработка различных игр и программного обеспечения

Ответ
 
Опции темы
Старый 16.01.2009, 00:30   #1
Игроман
 
Аватар для Hast


 
Регистрация: 13.07.2007
Адрес: Сімферополь
Сообщений: 3,012
Репутация: 629 [+/-]
ITlab Краткий мануал по PHP + MySQL

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

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

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

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

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

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

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

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

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

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

mysql_connect()

mysql_select_db()

mysql_query()

mysql_num_rows()

mysql_fetch_assoc()

mysql_error()

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

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

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

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

Скрытый текст:
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 код:
<?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 код:
<?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()


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

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

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

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

Скрытый текст:
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 код:
<?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 код:
<?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 код:
<?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 код:
<?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 код:
<?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, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.
подробнее здесь

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

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

1) Проверять текущее состояние magic quotes функицей get_magic_quotes_gpc() и в зависимости от результата валидировать или не валидировать данные

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

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

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

PHP код:
"SELECT * FROM `table_one` WHERE `field_one` LIKE '%".$string."%'" 
где % - любой(ые) символ(ы)

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

PHP код:
SELECT t1.*, t2.* FROM `table1` AS t1, `table2` AS t2 
В: А что если в обоих таблицах есть колонка с одинаковым названием, и значение обоих колонок мне нужно получить?
О: Нужно насильно задать уникальное имя колонки при выборке:

PHP код:
SELECT t1.name AS t1_namet2.name AS t2_name FROM `table1` AS t1, `table2` AS t2 


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

По всем вопросам и предложениям по улучшению мануала или фака — ко мне в ЛС.

Последний раз редактировалось Hast; 25.03.2010 в 18:00.
Hast вне форума  
Ответить с цитированием
Старый 28.02.2010, 23:08   #21
Игроман
 
Аватар для Hast


 
Регистрация: 13.07.2007
Адрес: Сімферополь
Сообщений: 3,012
Репутация: 629 [+/-]
SELECT Files.*, Subjects.Title AS subj_title

И это, кстати, в шапке есть.
Hast вне форума  
Ответить с цитированием
Старый 12.03.2011, 12:18   #22
Новичок
 
Регистрация: 03.06.2010
Сообщений: 0
Репутация: 0 [+/-]
Цитата:
Сообщение от adVISeR Посмотреть сообщение
Тем, что народ сейчас начнёт его везде использовать и писать свои "мега CMS", которые будут дохнуть от простой SQL инъекции.
Подскажите, тогда плиз как обезопасить от SQL инъекции этот код? или хотя бы как писать, чтобы с этой точки зрения было верно?
Просто очень много слов было написано о том, что код кривой, хотя, признаться, я и сам бы так написал (в плане алгоритма и запросов)
Хотелось бы, как новичку, увидеть правильно исполнение, изложенного автором сабжа, кода=)))
cmexxx вне форума  
Ответить с цитированием
Старый 12.03.2011, 12:39   #23
Шаман
 
Аватар для adVISeR

 
Регистрация: 13.04.2007
Адрес: Praha, ČR
Сообщений: 966
Репутация: 330 [+/-]
cmexxx
Если кратко, то нужно проверять и фильфтровать данные, после получения их из суперглобальных массивов. Нельзя данные из форм пихать в запросы сразу.
adVISeR вне форума  
Ответить с цитированием
Старый 12.03.2011, 19:07   #24
Новичок
 
Регистрация: 03.06.2010
Сообщений: 0
Репутация: 0 [+/-]
Вы случайно не имеете ввиду использование массивов $HTTP_POST_VARS и $HTTP_GET_VARS ?
кстати раз уж зашала речь о безопасности ведь можно еще огрничивать длину вводимых пользователем данных (это что касается инъекций через формы)
Другое дело когда инъекции через адресную строку... вот тут хотелось бы услышать дополнительные разъяснения от людей сведущих)))
cmexxx вне форума  
Ответить с цитированием
Старый 12.03.2011, 19:54   #25
Игроман
 
Аватар для Hast


 
Регистрация: 13.07.2007
Адрес: Сімферополь
Сообщений: 3,012
Репутация: 629 [+/-]
Цитата:
Сообщение от cmexxx Посмотреть сообщение
Вы случайно не имеете ввиду использование массивов $HTTP_POST_VARS и $HTTP_GET_VARS ?
$_POST и $_GET, не?

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

И да, в шапке, в разделе ЧаВо есть описание самых базовых мер безопасности.
Hast вне форума  
Ответить с цитированием
Старый 12.03.2011, 20:23   #26
Новичок
 
Регистрация: 03.06.2010
Сообщений: 0
Репутация: 0 [+/-]
Цитата:
Сообщение от Hast Посмотреть сообщение
$_POST и $_GET, не?
Нет, насколько я знаю,м вышеуказанные массивы передают свои параметры в адресной строке а это не есть хорошо

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

Последний раз редактировалось cmexxx; 12.03.2011 в 20:34.
cmexxx вне форума  
Ответить с цитированием
Старый 12.03.2011, 21:02   #27
Игроман
 
Аватар для Hast


 
Регистрация: 13.07.2007
Адрес: Сімферополь
Сообщений: 3,012
Репутация: 629 [+/-]
Цитата:
Сообщение от cmexxx Посмотреть сообщение
Нет, насколько я знаю,м вышеуказанные массивы передают свои параметры в адресной строке а это не есть хорошо
Где вы этого бреда набрались? $HTTP_POST_VARS содержит теже самые данные, что и $_POST с одним лишь отличием - массив $HTTP_POST_VAR, в отличии от $_POST, не является суперглобальным. Тоже самое для $_GET и $HTTP_GET_VARS

Цитата:
Сообщение от cmexxx Посмотреть сообщение
Напрямую-это вы имеете ввиду через адресную строку?
Через адресную строку передаются только $_GET параметры. $_POST данные передаются серверу уже в теле запроса (в заголовке указывается только размер передаваемых данных). Тебе никто не мешает написать свой http-клиент (да хоть на том же php через curl) и передавать запросы прямо на сервер.
Hast вне форума  
Ответить с цитированием
Старый 12.03.2011, 21:43   #28
Новичок
 
Регистрация: 03.06.2010
Сообщений: 0
Репутация: 0 [+/-]
ну вот и разобрались))) я новичок в этом, поэтому и спрашиваю, что не понятно)
благо что есть, кому объяснить)
cmexxx вне форума  
Ответить с цитированием
Старый 16.03.2011, 23:59   #29
Игрок
 
Аватар для Рыцарь
 
Регистрация: 03.11.2007
Адрес: Каменная цитадель)
Сообщений: 548
Репутация: 374 [+/-]
Объясните, пожалуйста, совсем понять не могу: с помощью каких СУБД можно создать распределённую базу данных? Задал этот вопрос здесь, поскольку здесь идёт речь и о MySQL.
__________________
Какие бы у тебя проблемы сейчас не были, просто остановись, посмотри на небо, глубоко вдохни и смело иди вперед. Знай, у тебя все получится и ни в коем случае не отступай!
Рыцарь вне форума  
Ответить с цитированием
Старый 17.03.2011, 15:27   #30
Юзер
 
Аватар для A&D
 
Регистрация: 12.11.2005
Сообщений: 109
Репутация: 223 [+/-]
Рыцарь,
Вот тут хорошая статья с примерами на Oracle - посмотри
http://citforum.ru/database/kbd96/45.shtml
A&D вне форума  
Ответить с цитированием
Старый 17.03.2011, 16:13   #31
Игрок
 
Аватар для Рыцарь
 
Регистрация: 03.11.2007
Адрес: Каменная цитадель)
Сообщений: 548
Репутация: 374 [+/-]
A&D, спасибо за статью.
А MySQL относится к распределённым БД?
__________________
Какие бы у тебя проблемы сейчас не были, просто остановись, посмотри на небо, глубоко вдохни и смело иди вперед. Знай, у тебя все получится и ни в коем случае не отступай!
Рыцарь вне форума  
Ответить с цитированием
Старый 27.03.2011, 13:54   #32
Юзер
 
Аватар для De-Luxis
 
Регистрация: 09.08.2005
Сообщений: 144
Репутация: 90 [+/-]
Цитата:
Сообщение от cmexxx Посмотреть сообщение
Подскажите, тогда плиз как обезопасить от SQL инъекции этот код?
что-то типа такого может уже защитить от sql инекций:
Скрытый текст:

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

А в основном конечно:
Цитата:
Сообщение от adVISeR Посмотреть сообщение
Если кратко, то нужно проверять и фильфтровать данные
К тому же обязательно пишите в пыхэпе с выключенным register_globals

Цитата:
Сообщение от Рыцарь Посмотреть сообщение
А MySQL относится к распределённым БД?
Бери PostgreSQL. Не ошибешься.
__________________
”*°•. `”*°••°*”` .•°*”`”*°•. `”*°••°*”` •°*”`
.•°*”`.•°*”`*ЛОВИ ПОЗИТИФФ*`”*°•.`”*°•.
.•°*”` .•°*”` .•°*”` `”*°•. `”*°•. `”*°•
De-Luxis вне форума  
Отправить сообщение для De-Luxis с помощью ICQ Ответить с цитированием
Старый 13.08.2016, 19:25   #33
Новичок
 
Аватар для shopman
 
Регистрация: 02.02.2012
Адрес: Москва, Санкт-Петербург
Сообщений: 7
Репутация: 2 [+/-]
Это какая версия PHP? начинаю изучать сейчас PHP поэтому многие советовали сразу начать с 7-ой версии. Кто что думает по этому поводу? Может какая книга есть стоящая чтобы без ошибок код можно было написать.
shopman вне форума  
Ответить с цитированием
Старый 21.09.2016, 15:07   #34
Юзер
 
Аватар для A&D
 
Регистрация: 12.11.2005
Сообщений: 109
Репутация: 223 [+/-]
shopman,
Актуальные версии 5.6 и 7.0
Документацию можно смотреть здесь http://php.net/docs.php
A&D вне форума  
Ответить с цитированием
Старый 13.05.2018, 15:16   #35
Новичок
 
Регистрация: 13.05.2018
Сообщений: 5
Репутация: 0 [+/-]
Конечно лучше с 7, ведь это самое новое обновление, а зачем тебе уже 5.2 или 5.3? Если они себя изжили и их ломают на раз.
Pravilo92 вне форума  
Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 07:53.


Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Rambler's Top100 Яндекс цитирования