LINUX.ORG.RU

[Mysql]Что-то вроде принципа неопределенности Гейзенберга

 


0

1

По наблюдениям, это работает так:

если мы любым способом узнаем insert_id(mysql_insert_id(), select count(*) from table и т.д.), запись не вставится;

если принудительно выставить id, который auto_increment и который уже когда-либо использовался в этой таблице(даже если сейчас он свободен), запись не вставится;

в остальных случаях insert query работает, но мне надо бы знать номер вставленной записи:(

Сам код:

$res = mysql_query('select * from branches where id='.$this->id);
	if($res->num_rows==0)
	{
	  $this->name = $name_;
	  mysql_query('insert into branches(name) values(\''.$name_.'\')');
// 	  $this->id = mysql_insert_id(); с этим предыдущая строка не работает
	}

★★★★
Ответ на: комментарий от baverman

попробовал, не работает:

$co = mysql_query('select max(id) from branches where 1');
	  $arr = mysql_fetch_array($co);
	  $this->id = $arr[0]+1;
	  mysql_query('begin');
	  mysql_query('insert into branches(id,name) values(\''.$this->id.'\',\''.$name_.'\')');
	  mysql_query('commit');
	  echo mysql_error();

wingear ★★★★
() автор топика

> если мы любым способом узнаем insert_id(mysql_insert_id(), select count(*) from table и т.д.), запись не вставится;

из-за чего «не вставится»? Ты делаешь что-то вроде:

$next_pk= `select count(*) from table`;

insert into table ($next_pk, ... );

такое, конечно работать не будет из-за конфликтов с параллельно так insert'ящами.

если принудительно выставить id, который auto_increment и который уже когда-либо использовался в этой таблице(даже если сейчас он свободен), запись не вставится;

в чем смысл использовать auto_increment, но при этом принудительно выставлять ID?

в остальных случаях insert query работает, но мне надо бы знать номер вставленной записи:(

я не знаю, что там у вас в ПоХаПе, но внутри mysql'я специально для этого имеется LAST_INSERT_ID(): http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_la...

gods-little-toy ★★★
()
Ответ на: комментарий от gods-little-toy

из-за чего «не вставится»?

Именно это и пытаюсь выяснить.

Попробовал использовать last_insert_id(), при каждом вызове увеличивается, но в базу ничего не добавляется

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

> Попробовал использовать last_insert_id(), при каждом вызове увеличивается, но в базу ничего не добавляется

происходит что-то сюрреалистичное. Таблица какая - myisam или innodb? если innodb, стоит ли autocommit?

gods-little-toy ★★★
()

Ну а в this->id после выполнения что сидит?

Далее, ох уж эти ваши implicit... Ресурс в функции кто передавать будет?

Ну и последнее:

$res->num_rows
O_-

GateKeeper ★★
()
Ответ на: комментарий от gods-little-toy

сначала myisam было, потом переделал в innodb. autocommit стоит

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

я тоже до вчерашнего дня думал, что не может-(

wingear ★★★★
() автор топика

сделай uniq для id и можешь юзать INSERT IGNORE

xpahos ★★★★★
()

1. Ты бы дэбажил свой код:
Посмотри что возвращает твой insert
И что mysql_insert_id
2. Включи показ всех ошибок, ворнингов, нотисов
3. Что пишешь?
4. Посоветовал бы обратиться в jabber конференцию по пхп, где помогут быстрее.
5. Не плохо было бы перед присвоением $this->id проверить, что вставка в БД прошла успешно.

impr
()

> // $this->id = mysql_insert_id(); с этим предыдущая строка не работает

Нет, так не бывает :)
Я тебе уже советовал детальные логи mysql включить, там тоже пусто?

Блин, в этом mysql даже последовательностей нет, вон как людям приходится извращаться:
http://www.microshell.com/database/mysql/emulating-nextval-function-to-get-se...

SOmni ★★
()
Ответ на: комментарий от heisenberg

Кому, как не Вам, это знать:) Да, я неправильно выразился - имеет место иллюзия нарушения причинно-следственной связи

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

С каждым вызовом увеличивается, но в базе по-прежнему ничего:(

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

Проверь на тот ли localhost ты коннектишься для просмотра базы. У меня периодически тоже бывает сюрреализм, а потом вспоминаю что на ноутбуке работаю с тем же проектом гита, который обращается на внешний mysql сервер, а я смотрю на локалхосте пхпадмином.

BaBL ★★★★★
()
Ответ на: комментарий от wm34

По принципу неопределенности самим фактом измерения частицы мы меняем её состояние. здесь происходит примерно тоже. Или, по крайней мере, выглядит похоже. Задание я уже завалил, но просто интересно, как такое м.б.

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

я сделал класс branch, который работает с базой и дает ООП-интерфейс к ветви дерева. Что делать, если нельзя создать ни одной ветви, так и не понял. Да и на полпути дошло, насколько абсрдны мои действия: стараться быстрее написать этот php-скрипт, чтобы получить возможность потом их писать по 8 часов в день, чтобы в оставшееся время бодрствования получить возможность заниматься тем, что мне интересно, как будто я не могу этого делать сейчас. Лучше уж куда-нибудь сисадмином и после первичной настройки всего спокойно учить webGL

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

> Да и на полпути дошло, насколько абсрдны мои действия: стараться быстрее написать этот php-скрипт, чтобы получить возможность потом их писать по 8 часов в день, чтобы в оставшееся время бодрствования получить возможность заниматься тем, что мне интересно, как будто я не могу этого делать сейчас.

) левелап!

kelyar ★★★★★
()

1. Берешь Postgres

2. Используешь Sequence

3. Профит!

Ох, пардон - у тебя же MySQL... Ну сам виноват значит :-)

no-dashi ★★★★★
()
Ответ на: комментарий от GateKeeper

у него пых, значит, посгрес практически отпадает

А это ничего, что в PHP фактически отстствует типизация?

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

В связи с тем, что PDO и мусклевый драйвер вполне себе нормально тягают поддерживаемые пыхом типы из базы, ответ: «Да, ничего». Тем более, что там и типов то в посгресе почти нет таких, которые не поддерживаются штатно пыхом: datetime -> DateTime, array в пыхе есть, интежеры, строки, флоаты есть, нет, разве что cidr/macaddr (последний раскладывается в int64 и гоняется в обе стороны без проблем). bytea даже в PDO штатно таскается как stream resource. Не говоря уж про мускль, в котором и типов-то чуть больше, чем в sqlite. Там поддерживать нечего, практически, но нет же, костылестроение и кривожопие у них в почете.

GateKeeper ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.