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

Исходное сообщение
"Запрос к MySQL из Perl"

Отправлено max1991 , 16-Окт-08 12:12 
Привет всем, помогите пожалуйста, столкнулся с проблемой, самому решить не удалось.
Структура таблицы:
---------------------------------------
| id | ip | local_or_not |
---------------------------------------
| 1 | 192.168.1 | 1 |
--------------------------------------
| 2 | 192.168.2 | 0 |
--------------------------------------
| 3 | 192.168.2.2 | 1 |
--------------------------------------

Нужно выполнить запрос к БД из скрипта, в MySQL он выглядет так :
mysql> SELECT local from local_nets WHERE LENGTH(ip) IN (SELECT MAX(LENGTH(ip)) FROM local_nets WHERE '192.168.2.2' LIKE CONCAT(RTRIM(ip),'%'));
И он работает, а из перла не получается, ругается на синтаксическую ошибку, вот текст скрипта:
##########################################
#!/usr/bin/perl

use Mysql;
$host="127.0.0.1";
$database="test";
$usr="test";
$pass="test";

$dbh = Mysql->Connect($host,$database,$usr,$pass) or print $Mysql::db_errstr;
$dbh->SelectDB($database) or print $Mysql::db_errstr;
print "Connecting to database...\n";
$table="local_nets";
$ip="192.168.2.2";
$sth = $dbh->query("SELECT local FROM $table WHERE LENGTH(`ip`) \
IN (SELECT MAX(LENGTH(ip)) FROM $table \
WHERE $ip like CONCAT(RTRIM(ip),'%')");
$w= $sth->fetchrow();
if ($w=="")
{
$w="0";
}
print "$w\n";

Ругается на кусок '$ip like CONCAT(RTRIM(ip),'%')', подозреваю, что проблема в кавычках, но решить самому не получилось.


Содержание

Сообщения в этом обсуждении
"Запрос к MySQL из Perl"
Отправлено Arpo , 16-Окт-08 12:43 
>[оверквотинг удален]
>WHERE $ip like CONCAT(RTRIM(ip),'%')");
>$w= $sth->fetchrow();
>if ($w=="")
>{
>$w="0";
>}
>print "$w\n";
>
>Ругается на кусок '$ip like CONCAT(RTRIM(ip),'%')', подозреваю, что проблема в кавычках, но
>решить самому не получилось.

попробуй так
CONCAT(RTRIM(ip),'\%')")
мало ли...


"Запрос к MySQL из Perl"
Отправлено max1991 , 16-Окт-08 15:36 
спасибо за помощь, так как хотел, разобраться не получилось,склоняюсь к выводу, что через perl mysql-ю вложенный запрос передать нельзя, решил вот таким способом:
$sth1 = $dbh->query("SELECT max(length(`ip`)) from $table \
where '$ip' like concat(rtrim(`ip`),'%')");
$w1= $sth1->fetchrow();
$sth = $dbh->query("SELECT `local` from $table \
where length(`ip`)='$w1' \
and '$ip' like concat('%',trim(`ip`),'%')");
$w= $sth->fetchrow();
if ($w=="")
{
$w="0";
}
print "$w\n";