Скрипт встает при определении существования данных в MySQL

Golishev

Новичок
Скрипт встает при определении существования данных в MySQL

Подскажите в чем ошибка, не хочет работать скрипт
PHP:
$res = mysql_query ("SELECT id FROM dostup WHERE id_acc='$id'",$db); 
if (!$res) {
mysql_query ("INSERT INTO dostup (ip,putdate,id_acc,browsers,systems) VALUES ('$ip', NOW( ) , '$id', '$browser', '$os')"); } 
else { $myrow_dostup = mysql_fetch_array ($res); 
$id_str = $myrow_dostup ["id"]; 
mysql_query ("UPDATE dostup SET ip='$ip', putdate=NOW(), id_acc='$id', browsers='$browser', systems='$os' WHERE id='$id_str'"); }
если в БД есть запись с необходимым id_acc то все ок запись обновляется. Но если записи нет то новая
запись не вносится. При этом ни каких ошибок не показывает. Если закоментировать всё кроме вставки
новой записи запись вставляется. Пробовал вызвать вывод ошибки (mysql_error()) по сле каждой операции ничего не выводит.
Суть скрипта заключается в следующем: 1. зашёл посетитель определяем его IP, браузер, систему. 2. Поверяем в базе имеется ли по нему запись если есть обновляем если нет добавляем. При этом поле id_acc не должно быть уникальным (для дальнейших дороботок).
Используется сборка apache2.2.10+php5.2.6+mysql5.0.67+phpmyadmin3.0.1.1

Сразу второй вопрос: при попытки записи в поле, ограниченное к примеру 2 символами (char(2)), данных с большим количеством символом (3-5-10), как должен повести себя mysql, обрезать до 2 символов и вставить либо выдать ошибку и вставку не проводить. Дело в том что у меня в локале ругается и выкидывает а на хостинге обрезает и вставляет.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
1. Когда задают вопросы обычно ставят восклицательные знаки.
2. Говорят "как ругаеццо"

Начни вот отсюда
www.phpfaq.ru

[telepat_mode]
Вероятнее всего причина в
google // mysql.com sql-mode
[/telepat_mode]
 

pilot911

Новичок
делай проще, перекладывай проверку на мускуль и выполняй всего лишь один запрос (первичный ключ, как я понимаю, id_acc ? )


PHP:
INSERT INTO 
     dostup (ip,putdate,id_acc,browsers,systems)    
VALUES VALUES 
     ('$ip', NOW( ) , '$id', '$browser', '$os')    
ON DUPLICATE KEY UPDATE VALUE 
     id_acc=LAST_INSERT_ID(id_acc) # чтобы получить id_acc функцией - обновленный или перезаписанный 
     ip='$ip', 
     putdate=NOW( ) , 
     browsers='$browser', 
     systems='$os')

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
 

Golishev

Новичок
Автор оригинала: pilot911
делай проще, перекладывай проверку на мускуль и выполняй всего лишь один запрос (первичный ключ, как я понимаю, id_acc ? )


PHP:
INSERT INTO 
     dostup (ip,putdate,id_acc,browsers,systems)    
VALUES VALUES 
     ('$ip', NOW( ) , '$id', '$browser', '$os')    
ON DUPLICATE KEY UPDATE VALUE 
     id_acc=LAST_INSERT_ID(id_acc) # чтобы получить id_acc функцией - обновленный или перезаписанный 
     ip='$ip', 
     putdate=NOW( ) , 
     browsers='$browser', 
     systems='$os')

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Использование "ON DUPLICATE KEY UPDATE" не подходит в связи с тем, что id_acc может принимать одинаковое значение, к примеру для незарегистрированных пользователей 0 или пусто.
 

Фанат

oncle terrible
Команда форума
В чем самый большой вред от ретивых писателей кода - это в том, что посетители общаются исключительно с ними. Уровень совпадает.

Golishev
Вопрос, который отвечает на твой вопрос.
if (!$res) { - что ты ожидаешь от этой строчки?
Читал ли ты в документации, что содержится в этой переменной?

И еще два вопроса
id_acc берется из кук?
как определяется IP адрес?
 

Golishev

Новичок
Автор оригинала: *****
В чем самый большой вред от ретивых писателей кода - это в том, что посетители общаются исключительно с ними. Уровень совпадает.

Golishev
Вопрос, который отвечает на твой вопрос.
if (!$res) { - что ты ожидаешь от этой строчки?
Читал ли ты в документации, что содержится в этой переменной?

И еще два вопроса
id_acc берется из кук?
как определяется IP адрес?
id_acc на данном моменте берется из базы после определения вошедшего пользователя.
Для определения IP используется $_SERVER['REMOTE_ADDR'];
 

Фанат

oncle terrible
Команда форума
"Штирлиц знал, что запоминается только последний вопрос".
А на первый ты не ответил потому что уже во всем разобрался? или просто про него забыл, отвечая на два последних?

А "определяется пользователь" - по кукам?
 

Golishev

Новичок
Автор оригинала: *****
"Штирлиц знал, что запоминается только последний вопрос".
А на первый ты не ответил потому что уже во всем разобрался? или просто про него забыл, отвечая на два последних?

А "определяется пользователь" - по кукам?
Пользователь определяется вводом имени и пароля (если верно берется id записи). А вопрос так и не решён. В сборке php 4х mysql 3х подобного типа запросы работали, может ошибка в настройках php или mysql. Я настраивал в соответствии с иструкциями с http://php-myadmin.ru/
Выше было указано на возможную причину с sql-mode, но так ничего вразумительного ненашол.

-~{}~ 14.11.08 11:36:

В my.ini стоит sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
 

Фанат

oncle terrible
Команда форума
придется повторить вопрос.

if (!$res) { - что ты ожидаешь от этой строчки?
Читал ли ты в документации, что содержится в этой переменной?
 

Golishev

Новичок
Автор оригинала: *****
придется повторить вопрос.

if (!$res) { - что ты ожидаешь от этой строчки?
Читал ли ты в документации, что содержится в этой переменной?
Как я понимаю в данной переменной результат который вернул запрос, TRUE при успехе, FALSE при ошибке.
 

Фанат

oncle terrible
Команда форума
Так TRUE или результат?
И какая у тебя там ошибка ожидается?
 

Golishev

Новичок
Работает при следующем формировании скрипта:
PHP:
$res = mysql_query ("SELECT id FROM dostup WHERE id_acc='$id'",$db);
if (mysql_num_rows ($res) < 1) {
mysql_query ("INSERT INTO dostup (ip,putdate,id_acc,browsers,systems) VALUES ('$ip', NOW( ) , '$id', '$browser', '$os')");
}
else {
$myrow_dostup = mysql_fetch_array ($res);
$id_str = $myrow_dostup ["id"];
mysql_query ("UPDATE dostup SET ip='$ip', putdate=NOW(), id_acc='$id', browsers='$browser', systems='$os' WHERE id='$id_str'");
}
 
Сверху