Скрипт встает при определении существования данных в 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 символов и вставить либо выдать ошибку и вставку не проводить. Дело в том что у меня в локале ругается и выкидывает а на хостинге обрезает и вставляет.
 
1. Когда задают вопросы обычно ставят восклицательные знаки.
2. Говорят "как ругаеццо"

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

[telepat_mode]
Вероятнее всего причина в
google // mysql.com sql-mode
[/telepat_mode]
 
делай проще, перекладывай проверку на мускуль и выполняй всего лишь один запрос (первичный ключ, как я понимаю, 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
 
Автор оригинала: 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 или пусто.
 
В чем самый большой вред от ретивых писателей кода - это в том, что посетители общаются исключительно с ними. Уровень совпадает.

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

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

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

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

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

А "определяется пользователь" - по кукам?
Пользователь определяется вводом имени и пароля (если верно берется 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"
 
придется повторить вопрос.

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

if (!$res) { - что ты ожидаешь от этой строчки?
Читал ли ты в документации, что содержится в этой переменной?
Как я понимаю в данной переменной результат который вернул запрос, TRUE при успехе, FALSE при ошибке.
 
Так TRUE или результат?
И какая у тебя там ошибка ожидается?
 
Работает при следующем формировании скрипта:
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'");
}
 
Сверху