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

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

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


 
Регистрация: 13.07.2007
Адрес: Київ
Сообщений: 2,894
Репутация: 620 [+/-]
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 вне форума  
Отправить сообщение для Hast с помощью ICQ Отправить сообщение для Hast с помощью Skype™ Ответить с цитированием
Старый 16.01.2009, 01:22   #2
ИТ-шник года (09,10)
 
Аватар для P1ece

 
Регистрация: 26.08.2005
Адрес: UA DNEPR
Сообщений: 2,079
Репутация: 785 [+/-]
Ну неплохо. Гуд. Новисам сойдет
__________________
С уважением, ведущий специалист F1 Service, Днепропетровск, Украина
P1ece вне форума  
Отправить сообщение для P1ece с помощью ICQ Ответить с цитированием
Старый 16.01.2009, 02:22   #3
Шаман
 
Аватар для adVISeR

 
Регистрация: 13.04.2007
Адрес: Praha, ČR
Сообщений: 969
Репутация: 327 [+/-]
PHP код ужасен чуть более чем полностью, вот народ начитается такого, и начнёт писать "индийский код"...
Особо улыбнули "or" в стиле Паскаля ))
Цитата:
сессия - это серверная кука, которая живёт до закрытия окна браузера
Бред, живёт она до конца таймаута, который указан в настройках.

P.S. Новая тема врятли нужна, по крайней мере в таком виде, лучше оформить в виде сообщения в теме про php, на которое будет ссылка в первом посте.
Так что либо оформляем в соотвествии с заголовком(php код всё равно не качественный), либо переезжаем в тему о php.
adVISeR вне форума  
Ответить с цитированием
Старый 16.01.2009, 14:58   #4
Мяу
 
Аватар для Hast


 
Регистрация: 13.07.2007
Адрес: Київ
Сообщений: 2,894
Репутация: 620 [+/-]
чем именно он ужасен? Можно конкретнее? Насчёт or/and - просто привык так писать. Особой разницы не вижу.
__________________
«Да вы прям полиция мыслей» via DikWithballs
«Хех. Только я ник сменил.» via Jack of Еvil
Hast вне форума  
Отправить сообщение для Hast с помощью ICQ Отправить сообщение для Hast с помощью Skype™ Ответить с цитированием
Старый 16.01.2009, 16:01   #5
Шаман
 
Аватар для adVISeR

 
Регистрация: 13.04.2007
Адрес: Praha, ČR
Сообщений: 969
Репутация: 327 [+/-]
Цитата:
чем именно он ужасен?
Тем, что народ сейчас начнёт его везде использовать и писать свои "мега CMS", которые будут дохнуть от простой SQL инъекции.

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

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

Я конечно понимаю, что это всё написано ради примера, но "учебники" должны быть
правильными полностью, иначе учиться по ним нельзя.
adVISeR вне форума  
Ответить с цитированием
Старый 16.01.2009, 17:12   #6
Мяу
 
Аватар для Hast


 
Регистрация: 13.07.2007
Адрес: Київ
Сообщений: 2,894
Репутация: 620 [+/-]
Цитата:
Сообщение от adVISeR Посмотреть сообщение
Тем, что народ сейчас начнёт его везде использовать и писать свои "мега CMS", которые будут дохнуть от простой SQL инъекции.
Ну, если прочитав 3-й абзац моего первого поста кто то не поймёт о чём там идёт речь - это уже далеко не мои проблемы Я предупредил, пхп код тут для примера, главная задача мануала - помоч понять новисам построение sql запросов. А то, КАК они будут использовать эти запросы и какой при этом использовать код пусть решают сами. Если бы были проблемы именно в sql - то другое дело. А так...

Ну, да, я согласен, некоторые пренибрежения стандартами и спорные моменты в коде есть. Но разве из-за этого его нужно называть ужасным? http://govnokod.ru/php вот это - да, вот это ужас. Я разумеется не считаю себя сверх граммотным программистом, это далеко не так. Но всё равно не думаю что мой код можно назвать ужасным
__________________
«Да вы прям полиция мыслей» via DikWithballs
«Хех. Только я ник сменил.» via Jack of Еvil
Hast вне форума  
Отправить сообщение для Hast с помощью ICQ Отправить сообщение для Hast с помощью Skype™ Ответить с цитированием
Старый 16.01.2009, 17:58   #7
Юзер
 
Аватар для A&D
 
Регистрация: 12.11.2005
Сообщений: 110
Репутация: 223 [+/-]
Hast

Цитата:
NOT NULL - не является нулём
Не является неопределенностью
A&D вне форума  
Ответить с цитированием
Старый 16.01.2009, 18:01   #8
Шаман
 
Аватар для adVISeR

 
Регистрация: 13.04.2007
Адрес: Praha, ČR
Сообщений: 969
Репутация: 327 [+/-]
Цитата:
код тут для примера
Собственно можно было обойтись и без него, раз уж мануал по MySQL только.
Заголовок поменял. В важное тему крепить не буду, в шапке темы по PHP ссылку оставлю.
Тему пока не закрываю. Посмотрим что из этого выйдет.
adVISeR вне форума  
Ответить с цитированием
Старый 16.01.2009, 18:26   #9
ИТ-шник года (09,10)
 
Аватар для P1ece

 
Регистрация: 26.08.2005
Адрес: UA DNEPR
Сообщений: 2,079
Репутация: 785 [+/-]
Цитата:
Условия в if/while нужно отделять скобками.
Спорно кстати. Я много вижу утверждений на тему

Цитата:
if ($a>$b){echo "Превед";}
говнокодерством, мол надо писать

Цитата:
if ($a>$b)echo "Превед";
Или ты не про это? А именно про

Цитата:
if ($a<$b)
__________________
С уважением, ведущий специалист F1 Service, Днепропетровск, Украина
P1ece вне форума  
Отправить сообщение для P1ece с помощью ICQ Ответить с цитированием
Старый 16.01.2009, 18:36   #10
Шаман
 
Аватар для adVISeR

 
Регистрация: 13.04.2007
Адрес: Praha, ČR
Сообщений: 969
Репутация: 327 [+/-]
Цитата:
Спорно кстати.
По стандартам многих контор, нужно помимо скобок ещё чётко отделять пробелами, т.е что-то вроде:
PHP код:
if ( ($a $b) && ($b $c) ) 
Цитата:
Или ты не про это?
И про это тоже.
adVISeR вне форума  
Ответить с цитированием
Старый 25.09.2009, 22:27   #11
Новичок
 
Аватар для _figer_
 
Регистрация: 28.04.2009
Адрес: >____> Сообщений:27615
Сообщений: 94
Репутация: 3 [+/-]
я в sql полный 0 да и faq этот немного устарел ( ссылки не работают)
разъясните пожалуйста как конектиться к своему же серверу БД. в faq которым я пользовался было сказано настроить в SQL Server Configuration Manager порт своего Tcp/ip но увы я при установленном sql нашел только Client Network Utility в котором можно настроить порт Tcp/ip но при входе в SQL Server Management Studio Express (и вводе там своих данных и пароля при установки) мне говорится что конечный компьютер отверг подключение.
пользуюсь sql 2005
_figer_ вне форума  
Ответить с цитированием
Старый 26.09.2009, 12:56   #12
Игрок
 
Аватар для V@s3K

 
Регистрация: 04.11.2005
Адрес: Рашка, Новосип
Сообщений: 518
Репутация: 283 [+/-]
Цитата:
Сообщение от _figer_ Посмотреть сообщение
faq этот немного устарел ( ссылки не работают)
Заменить в ссылках /ru/ на /en/ и читать.
__________________
vas3k.ru

Идя на собеседование, необходимо укрепиться в нескольких мыслях: эта контора — говно, и эта работа — говно, и зарплата — тоже говно. И ты будешь обречён делать говно из говна за говно половину сознательного времени жизни.
V@s3K вне форума  
Отправить сообщение для V@s3K с помощью Skype™ Ответить с цитированием
Старый 26.09.2009, 13:38   #13
Мяу
 
Аватар для Hast


 
Регистрация: 13.07.2007
Адрес: Київ
Сообщений: 2,894
Репутация: 620 [+/-]
Цитата:
Сообщение от _figer_ Посмотреть сообщение
faq этот немного устарел ( ссылки не работают)
исправил

Цитата:
Сообщение от _figer_ Посмотреть сообщение
разъясните пожалуйста как конектиться к своему же серверу БД
В первом же пункте (сразу после ссылок) описано как подключиться к БД.
Hast вне форума  
Отправить сообщение для Hast с помощью ICQ Отправить сообщение для Hast с помощью Skype™ Ответить с цитированием
Старый 22.02.2010, 01:30   #14
Dis is one half
 
Аватар для OneHalf
 
Регистрация: 19.10.2007
Адрес: Санкт-Петербург
Сообщений: 1,460
Репутация: 304 [+/-]
Есть ли какой-нибудь простой метод получить id (поле с автоинкрементом) только что добавленной записи?
Что-нибудь типа
SELECT id FROM (INSERT INTO (a, b, c ) VALUES (1, 2, 3))
Или чего-то подобного?
OneHalf вне форума  
Отправить сообщение для OneHalf с помощью ICQ Отправить сообщение для OneHalf с помощью Skype™ Ответить с цитированием
Старый 22.02.2010, 01:37   #15
Шаман
 
Аватар для adVISeR

 
Регистрация: 13.04.2007
Адрес: Praha, ČR
Сообщений: 969
Репутация: 327 [+/-]
OneHalf
http://ru2.php.net/manual/en/functio...-insert-id.php
Если конечно я правильно вопрос понял %)
adVISeR вне форума  
Ответить с цитированием
Старый 25.02.2010, 02:37   #16
Dis is one half
 
Аватар для OneHalf
 
Регистрация: 19.10.2007
Адрес: Санкт-Петербург
Сообщений: 1,460
Репутация: 304 [+/-]
Да, Правильно. Спасибо.

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

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

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

Последний раз редактировалось NANA; 25.02.2010 в 07:26.
OneHalf вне форума  
Отправить сообщение для OneHalf с помощью ICQ Отправить сообщение для OneHalf с помощью Skype™ Ответить с цитированием
Старый 25.02.2010, 20:39   #17
Игрок
 
Аватар для V@s3K

 
Регистрация: 04.11.2005
Адрес: Рашка, Новосип
Сообщений: 518
Репутация: 283 [+/-]
Цитата:
Сообщение от OneHalf Посмотреть сообщение
Подскажите, пожалуйста, как это лучше реализовать?
Циклом. Как же еще?
Или взять готовую реализацию из любого фреймворка, если знать где лежит.
__________________
vas3k.ru

Идя на собеседование, необходимо укрепиться в нескольких мыслях: эта контора — говно, и эта работа — говно, и зарплата — тоже говно. И ты будешь обречён делать говно из говна за говно половину сознательного времени жизни.
V@s3K вне форума  
Отправить сообщение для V@s3K с помощью Skype™ Ответить с цитированием
Старый 25.02.2010, 21:20   #18
Dis is one half
 
Аватар для OneHalf
 
Регистрация: 19.10.2007
Адрес: Санкт-Петербург
Сообщений: 1,460
Репутация: 304 [+/-]
Дык как вынуть это из типа поля?
В phpMyAdmin это выглядит так:

Я хочу узнать, как получить этот список из php. В принципе я может и статичным текстом этот список впихну на страничку, но хотелось бы знать, как выполнить и такой вариант
OneHalf вне форума  
Отправить сообщение для OneHalf с помощью ICQ Отправить сообщение для OneHalf с помощью Skype™ Ответить с цитированием
Старый 25.02.2010, 21:49   #19
Игрок
 
Аватар для V@s3K

 
Регистрация: 04.11.2005
Адрес: Рашка, Новосип
Сообщений: 518
Репутация: 283 [+/-]
Цитата:
Сообщение от OneHalf Посмотреть сообщение
В phpMyAdmin это выглядит так:
А, так оно в БД. Не признал.
Ня: http://dev.mysql.com/tech-resources/...-datatype.html
__________________
vas3k.ru

Идя на собеседование, необходимо укрепиться в нескольких мыслях: эта контора — говно, и эта работа — говно, и зарплата — тоже говно. И ты будешь обречён делать говно из говна за говно половину сознательного времени жизни.
V@s3K вне форума  
Отправить сообщение для V@s3K с помощью Skype™ Ответить с цитированием
Старый 28.02.2010, 22:51   #20
Dis is one half
 
Аватар для OneHalf
 
Регистрация: 19.10.2007
Адрес: Санкт-Петербург
Сообщений: 1,460
Репутация: 304 [+/-]
У меня очередная проблема:
Есть две таблицы Files и Subjects
Обращение к ним такого типа:

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

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

Опции темы

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

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

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


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


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