PHP-скрипт выполнил больше MySQL запросов чем нужно.

S
На сайте с 29.12.2008
Offline
43
936

PHP-скрипт выполнил больше MySQL запросов чем нужно.

Есть таблица "md5" с полями id, str, md5.

CREATE TABLE `md5` (

`id` bigint(20) NOT NULL auto_increment,

`str` varchar(100) NOT NULL,

`md5` varchar(100) NOT NULL,

UNIQUE KEY `id` (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Есть файл rus_eng.txt - список слов, всего строк в файле 194,775.


<?php
set_time_limit(0);

$file = fopen ("rus_eng.txt","r");
if ($file)
{
$link = mysql_connect("host", "login", "password"); //Подключаемся к серверу базы данных
mysql_select_db("db", $link); //Выбираем базу

while(!feof($file))
{
$str = fgets($file);
$md5 = md5($str);
$query = mysql_query("INSERT INTO md5 VALUES (0, '$str', '$md5')");
//echo "$query, $str, $md5<br>";
}
fclose ( $file);
mysql_close($link);
}
else
{
echo("Ошибка открытия файла");
}
echo "Done";

?>

Скрипт выполняется без ошибок.

Смотрю через PhpMyAdmin количество строк в таблице md5 - 575,895.

А ведь должно быть 194,775.

SF
На сайте с 11.10.2005
Offline
137
#1

может в файле есть пустые строки, в конце файла.

или вы несколько раз запускали скрипт

вам надо посмотреть в таблице какие поля одинаковые

**************************************************

ну такто принято на поля логин и пасворд(md5) назначать ключи уникальности

в зависимости от логики программы на одно поле или на пару полей

ALTER TABLE `md5` ADD UNIQUE `uniq1` (`str` ) - это на отдельное поле str

или

ALTER TABLE `md5` ADD UNIQUE `uniq2` (`str`, `md5` ) - это на пару полей

очищайте таблицу

TRUNCATE TABLE `md5`

ставте ключи и запускайте скрипт

тогда не сможете в таблицу записать одинаковые строки

PS

сейчас только заметил, поле id обычно назначается ключ Primary

инзерт должен будет выглядеть так

INSERT INTO md5 VALUES ('', '$str', '$md5')

или так

INSERT INTO md5 VALUES ('$str', '$md5')

******************

вот правильная таблица

CREATE TABLE `md5` (

`id` INT( 11 ) NOT NULL AUTO_INCREMENT ,

`str` VARCHAR( 100 ) NOT NULL ,

`md5` VARCHAR( 100 ) NOT NULL ,

PRIMARY KEY ( `id` ) ,

UNIQUE (

`str`

)

);

Инструкция: Как Правильно Делать Сайты: Домен, Хостинг, Установка CMS (http://www.3sd.ru/kak-delat-site/index.php).
S
На сайте с 29.12.2008
Offline
43
#2

Запрос

SELECT * FROM `md5` WHERE md5="1de32dfa1a9226786814f0acd35db2f7";

выдал

id str md5

8 F,CNHFRNYS[ 1de32dfa1a9226786814f0acd35db2f7

32008 F,CNHFRNYS[ 1de32dfa1a9226786814f0acd35db2f7

203060 F,CNHFRNYS[ 1de32dfa1a9226786814f0acd35db2f7

Выдало три дубля! Которых быть не должно.

srarwars добавил 14.08.2009 в 08:18

Удалил старую таблицу.

Сделал новую.

CREATE TABLE `md5` (

`id` INT( 11 ) NOT NULL AUTO_INCREMENT ,

`str` VARCHAR( 100 ) NOT NULL ,

`md5` VARCHAR( 100 ) NOT NULL ,

PRIMARY KEY ( `id` ) ,

UNIQUE (

`str`

)

);

Запрос mysql_query("INSERT INTO md5 VALUES ('$str', '$md5')");

Добавило только одну строку.

И то неправильную.

id=1

str=iybrf

А в файле rus_eng.txt под 1 строкой FFFFF

srarwars добавил 14.08.2009 в 08:44

После неудачи делаю

DELETE FROM `md5`;

TRUNCATE `md5`;

srarwars добавил 14.08.2009 в 08:46

в файле rus_eng.txt строк 194, 775.

Значит и в таблице md5 должно быть столько же строк?

[Удален]
#3

"INSERT INTO md5 ('str', 'md5') VALUES ('$str', '$md5')"

Во-первых, зачем вы туда пытаетесь запихнуть id=0, если у вас в таблице id - auto_increment?

Во-вторых, зачем md5 тип varchar(100), когда md5 всегда отдает 32-значный ключ?

В-третих, зачем вам вообще поле md5, если у вас сама строка содержится в 'str', а md5 поле содержит всего лишь md5-хеш той же строки?

Читаем синтаксис INSERT и понимаем, почему SQL запрос вставил в 3 раза больше данных, чем Вам нужно.

S
На сайте с 29.12.2008
Offline
43
#4

Скрипту удалось добавить все строки из файла rus_eng.txt в таблицу md5.

Индексы:

Имя индекса Тип Количество элементов Действие Поле

PRIMARY PRIMARY 190903 Изменить Удалить id

uniq2 UNIQUE 190903 Изменить Удалить str, md5_str

SQL-запрос $query = mysql_query("INSERT INTO md5 VALUES (0, '$str', '$md5_str')");

Всё правильно, но!

Количество элементов в файле rus_eng.txt = 194,775

Количество элементов в таблице md5 = 190,903

Строка в файле rus_eng.txt под номером 194,775 такая z.zhahsi

Запрос SELECT * FROM `md5` WHERE id=194775;

выдал "MySQL вернула пустой результат (т.е. ноль строк)"

Запрос SELECT * FROM `md5` WHERE id=190903;

выдал 190903 z.zhahsi 41d4d29dc278979043c7c0399b3ae40f

То есть в файле и в таблице нумерация строк (поле id) разная.

srarwars добавил 14.08.2009 в 10:41

So1:
"INSERT INTO md5 ('str', 'md5') VALUES ('$str', '$md5')"

Во-первых, зачем вы туда пытаетесь запихнуть id=0, если у вас в таблице id - auto_increment?
Во-вторых, зачем md5 тип varchar(100), когда md5 всегда отдает 32-значный ключ?
В-третих, зачем вам вообще поле md5, если у вас сама строка содержится в 'str', а md5 поле содержит всего лишь md5-хеш той же строки?
Читаем синтаксис INSERT и понимаем, почему SQL запрос вставил в 3 раза больше данных, чем Вам нужно.

>>>В-третих, зачем вам вообще поле md5, если у вас сама строка содержится в 'str', а md5 поле содержит всего лишь md5-хеш той же строки?

Пользователь вводит md5, скрипт запускает запрос "SELECT str FROM md5 WHERE md5_str=то, что ввёл пользователь".

>>>понимаем, почему SQL запрос вставил в 3 раза больше данных, чем Вам нужно.

не смог прочесть, всё на английском.

[Удален]
#5
srarwars:
>>>В-третих, зачем вам вообще поле md5, если у вас сама строка содержится в 'str', а md5 поле содержит всего лишь md5-хеш той же строки?
Пользователь вводит md5, скрипт запускает запрос "SELECT str FROM md5 WHERE md5_str=то, что ввёл пользователь".

"SELECT str FROM md5 WHERE md5(str) = то, что ввел пользователь"

и никаких лишних полей в БД.

srarwars:
>>>понимаем, почему SQL запрос вставил в 3 раза больше данных, чем Вам нужно.
не смог прочесть, всё на английском.

На русском

S
На сайте с 29.12.2008
Offline
43
#6

Всё равно не понял.

Там не сказано, почему SQL запрос вставил в 3 раза больше данных, чем Вам нужно.

srarwars добавил 14.08.2009 в 20:53

Почему то добавление останавливается на отметке 166328 строка

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