проблемы с выборкой в mysql разных версий

12
opaHzheBb1u
На сайте с 26.05.2006
Offline
168
1020

Здравстсвуйте.

Дело в следующем.

Делаю словарь терминов.

Все данные имеются в текстовом файле. Каждый термин с определением в отдельной строке. т.е.

термин1.определение1

термин2.определение2.

и т.д.

Пишу скрипт:

$filearray = file("file/s.txt");

foreach ($filearray as $asd)
{ $id = $id + 1;
$termin = substr($asd, 0, strpos($asd, "."));
$opr = substr($asd, strpos($asd, ".") + 1);
$first = substr($asd, 0, 1);
switch($first)
{
case "А":
$letter=1;
break;
case "Б":
$letter=2;
break;
// и т.д. все буквы алфавита.

}
$query = "INSERT INTO slovar VALUES ('".$id."', '".$letter."', '".$termin."', '".$opr."')";
mysql_query($query);
$id = $id++;
}

Все прекрасно добавляется в базу.

Выборку делаю вот так:

<?

$asd = mysql_query("SELECT * FROM `slovar` WHERE `letter`='".$l."'");
while($res = mysql_fetch_assoc($asd))
{
echo "<a href=termin.php?id=".$res['id'].">".$res['text']."</a><br>";
} ?>

где $l - параметр заданный в ссылке.

т.е. результатом должны быть все термины, начинающиеся с буквы А если $l=1 , с буквы Б если $l=2 и т.д.

В локале стоит mysql 5 - все отлично работает.

Переношу на сервер (mysql 4.0.24)- все слова выбираются в разброс. то с А то с Г.

Пробовал просто в phpmyadmin делать выборку SELECT * FROM `slovar` WHERE `letter`="1" - все равно батва вылазит.

Подскажите, что исправить нужно, чтобы в 4 mysql заработало.... :gm:

_ppr
На сайте с 28.06.2006
Offline
10
#1
opaHzheBb1u:

// и т.д. все буквы алфавита.

Эх молодежжь :)

А как базу переносил ?

opaHzheBb1u
На сайте с 26.05.2006
Offline
168
#2
_ppr:
Эх молодежжь

А как базу переносил ?

Я ее не переносил. Я сделал то же самое на стороне сервера (insert).

$filearray = file("file/s.txt");

foreach ($filearray as $asd)

{ $id = $id + 1;

$termin = substr($asd, 0, strpos($asd, "."));

$opr = substr($asd, strpos($asd, ".") + 1);

$first = substr($asd, 0, 1);

switch($first)

{

case "А":

$letter=1;

break;

case "Б":

$letter=2;

break;

// и т.д. все буквы алфавита.

}

$query = "INSERT INTO slovar VALUES ('".$id."', '".$letter."', '".$termin."', '".$opr."')";

mysql_query($query);

$id = $id++;

}

то есть база была сформирована точно так же как и в локале.

Переносить пробовал - проблема остается.

AN
На сайте с 05.06.2004
Offline
243
#3

[небольшой off]

$asd = mysql_query("SELECT * FROM `slovar` WHERE `letter`='".$l."'");
где $l - параметр заданный в ссылке.

Больше так не делайте ;)

[/небольшой off]

А по сабжу - явно дело в кодировках.

Размещу ваши баннеры на посещаемых сайтах. Места еще есть! Возможен безнал. (/ru/forum/324945) Нужны копирайтеры/рерайтеры - медики. Пишите в личку. (/ru/forum/676932)
_ppr
На сайте с 28.06.2006
Offline
10
#4

1.Пробуй перенести дамп базы (при генерации не забудь совместимость с 323)

2. Посмотри когда ты вставляешь в базу туда плывет то что ты ожидаешь:

$query = "INSERT INTO slovar VALUES ('".$id."', '".$letter."', '".$termin."', '".$opr."')";

print "$query <br>";

mysql_query($query);

$id = $id++;

opaHzheBb1u
На сайте с 26.05.2006
Offline
168
#5
AnNik:
Больше так не делайте

Почему?

_ppr:
1.Пробуй перенести дамп базы (при генерации не забудь совместимость с 323)

пробовал и совместимость с 3 и с 4. В самой базе все ок, если обзором смотреть. Только при выборке кал какой то получается.

AN
На сайте с 05.06.2004
Offline
243
#6
opaHzheBb1u:
Почему?

Ключевое слово: SQL-инъекция :)

Если, к примеру, у вас ссылки вида

http :// site.ru/?i=1

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

http :// site.ru/?i=1'drop table slovar

М
На сайте с 08.02.2006
Offline
59
#7
В локале стоит mysql 5

opaHzheBb1u, mysql 5 - это не локаль. Попробуйте на сервере mysql 4.0.24 сделать запрос перед выборкой "SET NAMES CP1251;"

Если после этого данные будут выбираться правильно, то надо будет пересоздать базу с параметром --default-character-set=cp1251 и таблицу с парметорами CHARACTER SET cp1251 COLLATE cp1251_bin

opaHzheBb1u
На сайте с 26.05.2006
Offline
168
#8
AnNik:
Ключевое слово: SQL-инъекция

Если, к примеру, у вас ссылки вида
http :// site.ru/?i=1
то кто-нибудь когда-нибудь обязательно попробует сделать так, например:
http :// site.ru/?i=1'drop table slovar

Это легко обходится. У меня скрипт вот так написан на самом деле, здесь сократил чтоб удобнее читать было без потери сути. вот:

switch($l)

{

case "1":

$let='1';

break;

case "2":

$let='2';

break;

case "3":

$let='3';

break;

case "4":

$let='4';

break;

case "5":

$let='5';

break;

case "6":

$let='6';

break;

case "7":

$let='7';

break;

case "8":

$let='8';

break;

case "9":

$let='9';

break;

case "10":

$let='10';

// ит.д по всем буквам

}

$asd = mysql_query("SELECT * FROM `slovar` WHERE `letter`='".$let."'");

opaHzheBb1u
На сайте с 26.05.2006
Offline
168
#9
Магнат:
opaHzheBb1u, mysql 5 - это не локаль. Попробуйте на сервере mysql 4.0.24 сделать запрос перед выборкой "SET NAMES CP1251;"
Если после этого данные будут выбираться правильно, то надо будет пересоздать базу с параметром --default-character-set=cp1251 и таблицу с парметорами CHARACTER SET cp1251 COLLATE cp1251_bin

Спасибо за помощь. Вам +!

М
На сайте с 08.02.2006
Offline
59
#10

switch($l)
{

case "1":
$let='1';
break;

а такая конструкция чем не устраивает?

$let=($l>0 && $l<34) ? $l : 0;

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий