URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1934
[ Назад ]

Исходное сообщение
"perl+dbi - если в запросе переменная"

Отправлено Дима , 30-Июл-03 16:27 
Не можете ли подсказать, как выполнит элементарную вещь на PERL+DBI?
так работает:
SELECT * FROM testtable WHERE username_t="pupkin"

а если:
Sa="pupkin";
SELECT * FROM testtable WHERE username_t="$a"
-  то не работает! Перепробовал все кавычки-конкатенации и пр. В инете конкретного ничего не нашел.
Подскажите, пожалуйста.


Содержание

Сообщения в этом обсуждении
"perl+dbi - если в запросе переменная"
Отправлено Дима , 30-Июл-03 17:59 
Отцы родные! Не оставьте в беде! Как это можно сделать?
Уже пропадает вера в PERL ....


"perl+dbi - если в запросе переменная"
Отправлено bladerunner , 30-Июл-03 18:44 

perldoc DBI
на предмет bind variables

"perl+dbi - если в запросе переменная"
Отправлено konst , 30-Июл-03 19:16 
>Не можете ли подсказать, как выполнит элементарную вещь на PERL+DBI?
>так работает:
>SELECT * FROM testtable WHERE username_t="pupkin"
>
>а если:
>Sa="pupkin";
>SELECT * FROM testtable WHERE username_t="$a"
>-  то не работает! Перепробовал все кавычки-конкатенации и пр. В инете
>конкретного ничего не нашел.
>Подскажите, пожалуйста.
Вот пример кода:
    use DBI;
    $dsn = "dbi:$db_driver:dbname=$db_name";
    $dbh = DBI->connect($dsn, $db_user, $db_password);
    my $sth = $dbh->prepare("SELECT u.id,u.name,u.status FROM users u,country c  where  c.id = u.country_id and u.id = $user_id");
    if (!$sth) {  $err_mes = $sth->errstr; } else {
        if (!$sth->execute) {$err_mes = $sth->errstr; }
    }
    ($user_id,$user_name,$user_status) = $sth->fetchrow_array;

"perl+dbi - если в запросе переменная"
Отправлено XMan , 30-Июл-03 21:55 
Вообще-то там строка, а не int. Насколько я понимаю, users.id это именно int.

Строки в запросе нужно брать в кавычки. Желательно, в одинарные. То есть получаем что-то типа:

SELECT * FROM testtable WHERE username_t=q($a);


"perl+dbi - если в запросе переменная"
Отправлено Дима , 31-Июл-03 11:12 
:-)
Толкового НИЧЕГО не услышал. Неужели так трудно сравнить со переменной-строкой?
Буду пытаться сам, спасибо за желание помочь.

"perl+dbi - если в запросе переменная"
Отправлено bladerunner , 31-Июл-03 14:18 
Наверное потому что не слушал. Очень трудно помочь человеку
который не хочет читать документацию :)

"perl+dbi - если в запросе переменная"
Отправлено konst , 31-Июл-03 14:31 
>:-)
>Толкового НИЧЕГО не услышал. Неужели так трудно сравнить со переменной-строкой?
>Буду пытаться сам, спасибо за желание помочь.
Что за ерунда!?
Тебе же говорят, если ты пользуешь perl+dbi, то
если в перл-скрипте ...prepare("select * from tab where name = '$name'") - то Perl сам подставит значение переменной и передаст БД корректный запрос. Что у тебя не получается????



"perl+dbi - если в запросе переменная"
Отправлено bladerunner , 31-Июл-03 14:37 

На самом деле не совсем так :)
Самая правильная конструкция будет такая:

$my_string = 'Some string with different characters';
$query = 'Select * from table where field=:string';
$sth = $dbh->prepare($query);
$sth->bind_param(':string',$my_string);
$sth->execute();

|| die ... Подставить по вкусу :)


"perl+dbi - если в запросе переменная"
Отправлено Дима , 31-Июл-03 15:10 
ребята , спасибо!
Но такая кострукция не работала!
$a="text1";
$dsn = "DBI:$driver:database=$database;host=$hostname";
$dbh = DBI->connect($dsn, $user, $password);
$sth = $dbh->prepare( q{
SELECT * FROM testtable WHERE username_t='$a'
}) || die "Can't prepare statement: $DBI::errstr";

Я попробовал конструкцию уважаемого konst - подставил строку - все ок.
$dsn = "dbi:$db_driver:dbname=$db_database";
$dbh = DBI->connect($dsn, $db_user, $db_password);
my $sth = $dbh->prepare("SELECT * FROM testtable WHERE username_t = '$a'");


Чудеса!
Конструкцию уважаемого bladerunner не пробовал - но все равно спасибо.
за помощь. Все перерыл, прежде чем заработало.
Еще раз громадное спасибо!