LINUX.ORG.RU

Debian 9.6 - perl 5.24.1 - UNSIGNED ZEROFILL

 ,


0

2

Здоровья Всем! Столкнулся с проблемой второй раз: 1. На хостинге обновили perl - не смогли разобраться, попросил откатить (перенести на старый сервер). 2. На локальной машине умер диск с 8-кой. Поставил 9.6 и проблема возникла опять - теперь надо разбираться.

Поле MySQL два знака c UNSIGNED ZEROFILL.

Выводит: site.com/catalog.pl?country=2

Должно быть: site.com/catalog.pl?country=02

Сайт старый. «Никогда такого не было, и вот опять» :) Может кто-то сталкивался? Какие мысли?

С таким описанием конечно помочь сможет только тот, кто реально сталкивался с такой проблемой.

Хотя, на моей практике были схожие случаи когда проявлялась разница в работе Oracle и MySQL (а сайт должен был работать что на первом, что на втором). Латали такое перлом зачастую. Как можно меньше логики из БД.

Думаю в твоем случае надо где-то вставить printf '%02s', $country_id; и на века…

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от DELIRIUM

Код - максимально сократил.

sub region {
 my $return;
 $text_quest = "
  SELECT region_id, $DATA{'LANGUAGE'}_region_name 
  FROM address_region
  WHERE
  id_country = $country AND
  region_act > 0
  GROUP BY region_id
 ";
 $sth = $dbh->prepare($text_quest);
 $sth->execute();

 if ($sth->err) {
  $return .= "Ошибка catalog_region_cat " . $sth->errstr;
 }
	
 $sth->bind_col( 1, \$region_id_tmp );
 $sth->bind_col( 2, \$name_tmp );
	
 while ( $sth->fetch ) {

# Костыль для решения, но таких мест много...
#     if ($region_id_tmp =~ /^\d$/) {
#        $region_id_tmp = '0' . $region_id_tmp;
#     }
	
  $return .= "<p><a title=\"$title_tmp\"   href=\"http://$DATA{'LANGUAGE'}.$DATA{'HOST_NAME'}/$_[1]?country=$country&amp;region=$region_id_tmp\"><span>$name_tmp</span></a></p>\n";

 }
 $sth->finish();
 return $return; 
}

medexpert
() автор топика
Ответ на: комментарий от medexpert

Они в DBI могли поменяли идеологию -> теперь всё пытается привестись к «подходящим» типам - в твоём случае это int. ИМНО всегда надо указывать тип возвращаемого значения аля

$sth->bind_param(1, $date, SQL_DATE);
$sth->bind_param(2, $n, SQL_INTEGER);
в твоём случае надо
$sth->bind_col( 1, \$region_id_tmp, SQL_STRING );
Это легко сделать sed-ом, как-то так, но я чисто эмпирически.

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.