Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > mysql_insert_id возвращает 0


Автор: gvozd 9.2.2008, 09:40
Здравствуйте! Столкнулся с проблемой, которую не могу решить в одиночку. Есть следующая функция:
Код

function add_new_product($code, $name, $price, $status, $guarantee){
    db_query("INSERT INTO `product`(name, catalog_id) VALUES('".db_input($name)."', '".$this->product_catalog_id."')", "db_link");
    $p_id = mysql_insert_id("db_link");
    if($p_id == 0) {
        fwrite(fopen('ee', 'w'), "INSERT INTO `product`(name, catalog_id) VALUES('".db_input($name)."', '".$this->product_catalog_id."')");
    }
    db_query("INSERT INTO `provider_product`(
    product_id,
    provider_id,
    catalog_id,
    product_name,
    code,
    price, guarantee, status, date_add)
    VALUES(
    '".$p_id."',
    '".$this->id."',
    '".$this->catalog_id."',
    '".db_input($name)."',
    '".db_input($code)."',
    '".$price."', '".$guarantee."', '".$status."', '".date('Y-m-d', time() + TIME_ZONE)."')", "db_link");
    $pp_id = mysql_insert_id("db_link");
    $this->check_product_id .= $pp_id.',';
}


После выполнения первого запроса, mysql_insert_id возвращает 0, текст запроса: "INSERT INTO `product`(name, catalog_id) VALUES('Alcatel S853 Black', '1')".  В базу строка добавляется с автоинкрементируемым id = 364637. Почему так может происходить?

Автор: vasac 9.2.2008, 11:38
Я не знаю что такое db_query() и почему вы передаете в mysql_insert_id строку.

Автор: gta4kv 9.2.2008, 11:59
а и в db_query, вы тоже передаете строку. а дб_квери это наверно собственная функция. и очень может быть что не рабочая.

Автор: gvozd 9.2.2008, 14:35
Код

function db_query($query, $link = 'db_link') {
global $$link, $logger;
    $result = mysql_query($query, $$link) or db_error($query, mysql_errno(), mysql_error());
    return $result;
}

function db_connect($server = DB_SERVER, $username = DB_SERVER_USERNAME, $password = DB_SERVER_PASSWORD, $database = DB_DATABASE, $link = 'db_link') {
    global $$link;
    if (USE_PCONNECT == 'true') {
        $$link = mysql_pconnect($server, $username, $password);
    } else {
        $$link = mysql_connect($server, $username, $password);
    }
    if ($$link) mysql_select_db($database); {
            db_query("SET CHARSET cp1251", $link);
        return $$link;
    }
}


Это обертки для работы с БД. В mysql_insert_id передаю указатель сессии, т.к. мне приходится работать с двумя БД.

Автор: gvozd 9.2.2008, 15:08
gta4kv, спасибо за помощь! Работает функция:
Код

function db_last_id($link = 'db_link') {
global $$link, $logger;
   $result = mysql_insert_id($$link);
   return $result;
}

Автор: FractalizeR 9.2.2008, 16:01
Не думаю, что имеет смысл делать вот это
Код

return $$link;


Почему бы из db_connect не вернуть просто ресурс подключения? Кроме того, зачем вам в одном скрипте несколько раз подключаться к серверу DB? Поменять текущую базу данных или сделать выборку данных из другой базы без ее смены (mysql_select_db) можно сделать и так.

А если уж приспичило, то не проще ли ссылку на переменную передать (&), в которую нужно вернуть идентификатор подключения?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)