Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: sql-запрос как правильнее будет?
 
 автор: Bvz   (15.08.2010 в 12:28)   письмо автору
 
 

есть переменные $module и $id, где первая переменная строка, а вторая число
как правильнее составить запрос:

"SELECT * FROM `{$module}` WHERE `id`='$id'"

"SELECT * FROM `'.$module.'` WHERE `id`=$id"

  Ответить  
 
 автор: Valick   (15.08.2010 в 12:37)   письмо автору
 
   для: Bvz   (15.08.2010 в 12:28)
 

а что второй вариант тоже работает?

  Ответить  
 
 автор: Trianon   (15.08.2010 в 12:38)   письмо автору
 
   для: Bvz   (15.08.2010 в 12:28)
 

неправильны оба.

  Ответить  
 
 автор: Bvz   (15.08.2010 в 12:43)   письмо автору
 
   для: Trianon   (15.08.2010 в 12:38)
 

а как правильно?

  Ответить  
 
 автор: Trianon   (15.08.2010 в 13:20)   письмо автору
 
   для: Bvz   (15.08.2010 в 12:43)
 

http://dev.mysql.com/doc/refman/5.0/en/string-syntax.html
http://dev.mysql.com/doc/refman/5.0/en/identifiers.html

  Ответить  
 
 автор: Bvz   (16.08.2010 в 12:46)   письмо автору
 
   для: Trianon   (15.08.2010 в 13:20)
 

если я правильно понял, то запрос будет выглядеть так:


"SELECT * FROM '$module' WHERE `id`=$id AND `main`=1 AND `name`='Вася'"

а если функция добавляется, то так '".функция."'

  Ответить  
 
 автор: Trianon   (16.08.2010 в 12:58)   письмо автору
 
   для: Bvz   (16.08.2010 в 12:46)
 

$module вообще подставляться не должен.
Но если подставляется, то окружать имя таблицы нужно точно `также` как и имя поля.
Функция никак не добавляется. Добавляется фрагмент запроса - со всеми вытекающими рисками.
Точно также подставить $name вместо Вася - не выйдет.

  Ответить  
 
 автор: Bvz   (16.08.2010 в 13:14)   письмо автору
 
   для: Trianon   (16.08.2010 в 12:58)
 

>$module вообще подставляться не должен.
почему, а как правильно?

>Но если подставляется, то окружать имя таблицы нужно точно `также` как и имя поля.
`$module` - понял


>Функция никак не добавляется. Добавляется фрагмент запроса - со всеми вытекающими рисками.
а вот это password='".mysql_real_escape_string($password)."'

>Точно также подставить $name вместо Вася - не выйдет.
что именно не выйдет? `name`='$name' разве не выйдет, почему?

  Ответить  
 
 автор: Trianon   (16.08.2010 в 17:47)   письмо автору
 
   для: Bvz   (16.08.2010 в 13:14)
 

>>$module вообще подставляться не должен.
>почему, а как правильно?

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


>
>>Но если подставляется, то окружать имя таблицы нужно точно `также` как и имя поля.
>`$module` - понял
>
>
>>Функция никак не добавляется. Добавляется фрагмент запроса - со всеми вытекающими рисками.
>а вот это password='".mysql_real_escape_string($password)."'

в этом случае (если mysql_real_escape_string окружается апострофами) - это как раз пример устранения такого риска.

>
>>Точно также подставить $name вместо Вася - не выйдет.
>что именно не выйдет? `name`='$name' разве не выйдет, почему?

Именно потому, что mysql_real_escape_string не применен.

  Ответить  
 
 автор: Bvz   (16.08.2010 в 18:41)   письмо автору
 
   для: Trianon   (16.08.2010 в 17:47)
 

>>>$module вообще подставляться не должен.
>>почему, а как правильно?
>
>Потому что имя таблицы не должно зависеть от прикладных данных.
>
т.е. можно добавлять через mysql_real_escape_string или можно просто в кавычки обернуть?


>>>Функция никак не добавляется. Добавляется фрагмент запроса - со всеми вытекающими рисками.
>>а вот это password='".mysql_real_escape_string($password)."'
>
>в этом случае (если mysql_real_escape_string окружается апострофами) - это как раз пример устранения такого риска.

а точки внутри нужны и в каких случаях их ставить?

>>>Точно также подставить $name вместо Вася - не выйдет.
>>что именно не выйдет? `name`='$name' разве не выйдет, почему?
>
>Именно потому, что mysql_real_escape_string не применен.

т.е. любую строковую переменную нужно пропускать через mysql_real_escape_string или только ту, что поступает извне?

  Ответить  
 
 автор: Trianon   (16.08.2010 в 22:57)   письмо автору
 
   для: Bvz   (16.08.2010 в 18:41)
 

>>>>$module вообще подставляться не должен.
>>>почему, а как правильно?
>>
>>Потому что имя таблицы не должно зависеть от прикладных данных.
>>
>т.е. можно добавлять через mysql_real_escape_string или можно просто в кавычки обернуть?

в какие кавычки?
перечитывайте ответ.

>>>>Функция никак не добавляется. Добавляется фрагмент запроса - со всеми вытекающими рисками.
>>>а вот это password='".mysql_real_escape_string($password)."'
>>
>>в этом случае (если mysql_real_escape_string окружается апострофами) - это как раз пример устранения такого риска.
>
>а точки внутри нужны и в каких случаях их ставить?

внутри строки никаких точек нет. разбирайтесь со строковыми операциями языка PHP - не SQL.


>>>>Точно также подставить $name вместо Вася - не выйдет.
>>>что именно не выйдет? `name`='$name' разве не выйдет, почему?
>>
>>Именно потому, что mysql_real_escape_string не применен.
>
>т.е. любую строковую переменную нужно пропускать через mysql_real_escape_string или только ту, что поступает извне?
Любое строковое значение, оборачиваемое апострофами, независимо от того, из переменной она или еще откуда. Для констант, не содержащих спецсимволов допустимо сделать исключение. Но и только лишь.

  Ответить  
 
 автор: Bvz   (17.08.2010 в 08:00)   письмо автору
 
   для: Trianon   (16.08.2010 в 22:57)
 

спасибо многое стало на места, а как поступать с числом в запросе в случае если она явно задается, то число идет без апострофов, а если как переменная задается $id например?

  Ответить  
 
 автор: Trianon   (17.08.2010 в 10:16)   письмо автору
 
   для: Bvz   (17.08.2010 в 08:00)
 

" ... WHERE  id = ".((int)$id)

  Ответить  
 
 автор: Bvz   (22.08.2010 в 03:43)   письмо автору
 
   для: Trianon   (17.08.2010 в 10:16)
 

т.е. получиться должно примерно так:

"SELECT * FROM `module`  
WHERE `module`='".mysql_real_escape_string($module)."'  
AND `id`='".((int)$id)."'


и если $module и $id поступают из $_GET, $_POST, $_COOKIE и $_REQUEST, то их нужно обработать:

<?php
$id 
intval($_GET['id']);
$module get_magic_quotes_gpc() ? stripslashes($_POST['module']) : $_POST['module'];
?>


правильно?

а можно заменить?

<?php
$module
MagicQuotes($_POST['module']);
function 
MagicQuotes($module)
    {
        
$module get_magic_quotes_gpc() ? stripslashes($module) : $module;
        
$module trim($module);
        return 
$module;
    };
?>

  Ответить  
 
 автор: Trianon   (22.08.2010 в 10:26)   письмо автору
 
   для: Bvz   (22.08.2010 в 03:43)
 

да, как-то так.
правда неясно зачем trim в функции, и почему её параметр аргумент называется module.

  Ответить  
 
 автор: Bvz   (22.08.2010 в 10:37)   письмо автору
 
   для: Trianon   (22.08.2010 в 10:26)
 

можно убрать?


<?php
function MagicQuotes()
    {
        
$module get_magic_quotes_gpc() ? stripslashes($module) : $module;
        
$module trim($module);
        return 
$module;
    };
?>


а разве не нужно убирать пробелы? и где это лучше сделать?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования