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


Автор: supercelt 22.12.2009, 00:29
Привет!
Такая проблема:
Есть текстовый файл, в кодировке UTF-8

Код

3
banky
komerční banka
komercni banka
kod banky


Читаю файл. Первая строка - это то что надо потом вставить в базу. ($cat)
Тип поля базы - smallint(6). Кодировка базы - utf-8, сравнение - utf-8 general-ci. Эта цифра не вставляется, даже если очистить эту строку от пробелов, спецсимволов, а также если вручную привести эту строку к числовому типу. 
Код

$cat = rtrim(trim($cat));

$cat = (int)$cat;
или
settype($cat, 'integer');
или
settype($cat, 'int');
 
Не помогает.

Кстати, если сделать settype($cat, 'integer');, то получается тип - boolean

Автор: Ипатьев 22.12.2009, 08:48
у чисел нет кодировки.
что значит "не вставляется"?

Автор: lelik133 22.12.2009, 09:20
не вставляется, mysql_error() в студию, по коду приведенному выше гадать не будем

Автор: supercelt 22.12.2009, 21:23
Ипатьев У чисел-то нет, но это строка, которая читается из файла. 
Код

4
слово1
слово2
слово3
слово4

Код

$file = file('word.txt');

Потом в цикле применяю счётчик, таким образом первая строка из файла всегда выделяется и записывается в отдельную переменную, к примеру в $id.
Так вот если сделать - 
gettype, то выдаст - string
А если проверить $id ф-ией is_numeric, то выдаст - False

Не всчтавляется, это значит что в поле после вставки стоит 0, потому что 0 - это дефолтное значение поля. Вот странно. Перед запросом в базу вывоожу это в браузер - показывает число(или всё-таки строку), но в БД не вставляет. Запрос проверенный, потому что если вь коде, вместо перменной поставить просто любое число, то оно вставляется. А если подставить переменную - то нет.

Добавлено через 52 секунды
lelik133  Mysql_error() ничего не выводит, запрос правильный. 

Автор: Ипатьев 22.12.2009, 23:11
Еще раз.
У чисел не бывает кодировки.
У файлов - тоже.
Дело не в кодировке, а в РНР коде, который готовит или выполняет запрос.
Код надо отлаживать.
Причем чем раньше будет понято, что кодировки здесь не при чем, тем быстрее будет найдена очередная глупая опечатка

Автор: lelik133 22.12.2009, 23:23
Цитата

запрос правильный.  

ну тогда в чем вопрос, все же правильно
а сделать echo запроса посмотреть глазами, чем он отличается от того что вводиться в ручную и найти ошибку нельзя?

Автор: supercelt 22.12.2009, 23:43
Может я чего-то не вижу...
Код

$cat = rtrim(trim($cat));
echo $cat; // Выводит на экран число 2, то что и надо
                                //Это запрос к БД
                                                $insert_to_jvse_links = 'insert into `'.$dbprefix.'jvse_links` set `link_type`="1", `partner_url`="'.$lh.'", 
                        `link_category`="'.$cat.'", `link_status`="0", `link_added_on`="'.$time_now.'", 
                        `link_published_on`="'.$time_now.'", `rlc_last_checked_on`="0", `date_of_last_reminder`="0", `snap_status`="1", 
                        `enable_scheduler`="1", `featured`="0", `out_hits`="0", `gpr_lcache_time`="0", `uid`="0", `add_relnofollow`="1", 
                        `gpr`="0", `gpr_update`="0", `atr`="0", `atr_update`="0", `sticky`="0"';
echo $insert_to_jvse_links;    
//Выводит:
//insert into `jos_jvse_links` set `link_type`="1", `partner_url`="www.InfinitiUSA.com", `link_category`="2", `link_status`="0", //`link_added_on`="1261514373", `link_published_on`="1261514373", `rlc_last_checked_on`="0", `date_of_last_reminder`="0", //`snap_status`="1", `enable_scheduler`="1", `featured`="0", `out_hits`="0", `gpr_lcache_time`="0", `uid`="0", `add_relnofollow`="1", //`gpr`="0", `gpr_update`="0", `atr`="0", `atr_update`="0", `sticky`="0"            
                        if(mysql_query($insert_to_jvse_links))
                        echo 'yes<br />';// Выводит yes
                        else
                        echo mysql_error().'5no<br />'; //Выводит ошибку, если есть.


`link_category`="2", - Показало эхо хапроса. А теперь я лезу в базу и вижу в этом поле - НУЛИИИ ((

Автор: nerezus 23.12.2009, 06:00
`link_category`= 2

Ни кавычки, ни непечатываемые символы с загадочными кодами не нужны.

Автор: supercelt 23.12.2009, 15:57
nerezus, если я убираю кавычки, то пишется ошибка - Unknown column '2' in 'field list'

Автор: bars80080 23.12.2009, 16:05
как легко было бы исправить ошибку, если бы вы запостили сюда ещё и сам запрос, плюс формат таблицы (show create table)

Автор: supercelt 23.12.2009, 21:45
bars80080 Запрос:

Код

$insert_to_jvse_links = 'insert into `'.$dbprefix.'jvse_links` set `link_type` = "1", `partner_url`="'.$output_6.'", 
            `partner_email`="'.$output_8.'", `link_category`='.$category.', `link_status`="0", `link_added_on`="'.$time_now.'", 
            `link_published_on`="'.$time_now.'", `rlc_last_checked_on`="0", `date_of_last_reminder`="0", `snap_status`="1", `enable_scheduler`="1", 
            `featured`="0", `out_hits`="0", `gpr_lcache_time`="0", `uid`="0", `add_relnofollow`="1", `gpr`="0", `gpr_update`="0", `atr`="0", 
            `atr_update`="0", `sticky`="0";';
            if(mysql_query($insert_to_jvse_links))
            echo '1yes<br />';
            else
            echo mysql_error().'1no<br />';


Структура

Код

-- phpMyAdmin SQL Dump
-- version 2.6.1
-- http://www.phpmyadmin.net
-- 
-- Хост: localhost
-- Время создания: Дек 23 2009 г., 21:47
-- Версия сервера: 5.0.45
-- Версия PHP: 5.2.4
-- 
-- БД: `joomla`
-- 

-- --------------------------------------------------------

-- 
-- Структура таблицы `jos_jvse_links`
-- 

CREATE TABLE `jos_jvse_links` (
  `id` int(11) NOT NULL auto_increment,
  `link_type` smallint(6) NOT NULL default '2',
  `partner_url` varchar(250) NOT NULL default '',
  `partner_email` varchar(100) NOT NULL default '',
  `reciprocal_link_url` varchar(250) NOT NULL default '',
  `link_category` smallint(6) default '0',
  `link_status` smallint(6) NOT NULL default '2',
  `link_added_on` int(11) NOT NULL default '0',
  `link_published_on` int(11) NOT NULL default '0',
  `link_rating` float NOT NULL default '0',
  `num_votes` int(11) NOT NULL default '0',
  `rlc_last_checked_on` int(11) NOT NULL default '0',
  `reject_reason` longtext NOT NULL,
  `emstr` varchar(32) NOT NULL default '',
  `date_of_last_reminder` int(11) NOT NULL default '0',
  `snap_status` smallint(6) NOT NULL default '0',
  `enable_scheduler` int(11) NOT NULL default '0',
  `featured` smallint(6) NOT NULL default '0',
  `out_hits` int(11) NOT NULL default '0',
  `gpr_lcache_result` varchar(30) NOT NULL default '',
  `gpr_lcache_time` int(11) NOT NULL default '0',
  `uid` int(11) NOT NULL default '0',
  `sef_string` varchar(60) NOT NULL default '',
  `itr_numvisits` int(11) NOT NULL default '0',
  `itr_lastvisittime` int(11) NOT NULL default '0',
  `itr_pagevisited` varchar(250) NOT NULL default '',
  `itr_frompage` varchar(250) NOT NULL default '',
  `ere_result` int(11) NOT NULL default '1',
  `flink_txn_id` varchar(80) NOT NULL default '',
  `metakeys` varchar(250) NOT NULL default '',
  `secondary_catids` varchar(250) NOT NULL default '',
  `add_relnofollow` smallint(6) NOT NULL default '0',
  `gpr` int(6) NOT NULL default '0',
  `gpr_update` int(11) NOT NULL default '0',
  `atr` int(11) NOT NULL default '0',
  `atr_update` int(11) NOT NULL default '0',
  `sticky` int(6) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
        


Автор: bars80080 23.12.2009, 21:55
это не запрос, это пхп-венигрет. запрос не содержит пхп-вставок, получить его - проще простого: 

echo $insert_to_jvse_links;



п.с. вы уверены, что конструкция вида INSERT INTO table SET field=value, ... работает?

у меня лично она помнится вызывала немедленную ошибку

Автор: nerezus 23.12.2009, 21:56
supercelt, Query OK, 1 rows affected (63 ms)

Автор: supercelt 23.12.2009, 22:28
bars80080 
Вот echo запроса, я его постил выше

insert into `jos_jvse_links` set `link_type`="1", `partner_url`="www.InfinitiUSA.com", `link_category`="2", `link_status`="0", `link_added_on`="1261514373", `link_published_on`="1261514373", `rlc_last_checked_on`="0", `date_of_last_reminder`="0", `snap_status`="1", `enable_scheduler`="1", `featured`="0", `out_hits`="0", `gpr_lcache_time`="0", `uid`="0", `add_relnofollow`="1", `gpr`="0", `gpr_update`="0", `atr`="0", `atr_update`="0", `sticky`="0"

А конструкция INSERT INTO table SET field=value работает и ещё как. У меня всегда работала. Я кстати попробовал сделать и по классическому варианту (...) values (...) - результат один и тот же

Добавлено через 46 секунд
nerezus, А что это значит?  smile 

Автор: bars80080 23.12.2009, 23:07
что-то у меня такое ощущение, что у нас разные мусклы. такой бы запрос у меня не прошёл по трём параметрам. завтра специально проверю на своей машине

Автор: unicross 24.12.2009, 01:23
Цитата(supercelt @  22.12.2009,  00:29 Найти цитируемый пост)
Есть текстовый файл, в кодировке UTF-8

supercelt, у вас перед цифрой 2 расположено 3 служебных байта, сокращенно называемых BOM. Удалите эти байты и все будет нормально :
Код

$cat = str_replace("\xEF\xBB\xBF", '', $cat);

Или сохраните файл word.txt в кодировке UTF-8 без BOM.

Автор: supercelt 24.12.2009, 02:49
unicross, Спасибо большое тебе дружище! И правда заработало)

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