У меня есть данные в базе данных как INT и REAL, информацию из формы я читаю, как строку. Надо ли преобразовывать строку в численные данные? (дело в том, что у меня программа работала без преобразования, а сейчас, когда я ввела смесь букв и цифр , то получила ощибку.) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 (что такое line 1? Это первая строка SQL? Или моего кода на рнр?) Может ли быть причиной эти непреобразованные данные? (если ошибка в синтаксисе, то почему она в большинстве случаев работает?) UPDATE inventory SET pot_size='60', price='2', qoh='10o', image='images/orange_jasmine.jpg' WHERE invID=3 Вот при изменении qoh='10' на qoh='10o' 1 раз сработала без ошибки, другой раз с ошибкой. (когда срабатывает, то буквы просто отбрасываются и записывается 10 в бд) в phpMyAdmin этот SQL запрос срабатывает нормально. Извините, что сумбурно.
Это строка SQL запроса. ------------- @jacaranda Приведите, пожалуйста, а) структуры таблицы inventory б) SQL MODE во время запроса, ибо может быть и так: Код (Text): mysql> select @@session.sql_mode; +--------------------+ | @@session.sql_mode | +--------------------+ | | +--------------------+ 1 row in set (0.00 sec) mysql> create table testsqlmode (someint int ); Query OK, 0 rows affected (0.01 sec) mysql> insert into testsqlmode values(10); Query OK, 1 row affected (0.00 sec) mysql> insert into testsqlmode values('10'); Query OK, 1 row affected (0.00 sec) mysql> insert into testsqlmode values('10a'); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from testsqlmode; +---------+ | someint | +---------+ | 10 | | 10 | | 10 | +---------+ 3 rows in set (0.00 sec) mysql> select @@session.sql_mode; +--------------------+ | @@session.sql_mode | +--------------------+ | | +--------------------+ 1 row in set (0.00 sec) mysql> set @@session.sql_mode = STRICT_ALL_TABLES; Query OK, 0 rows affected (0.00 sec) mysql> select @@session.sql_mode; +--------------------+ | @@session.sql_mode | +--------------------+ | STRICT_ALL_TABLES | +--------------------+ 1 row in set (0.00 sec) mysql> insert into testsqlmode values('10a'); ERROR 1265 (01000): Data truncated for column 'someint' at row 1 mysql> insert into testsqlmode values('20a'); ERROR 1265 (01000): Data truncated for column 'someint' at row 1 mysql> insert into testsqlmode values('20'); Query OK, 1 row affected (0.00 sec) mysql> insert into testsqlmode values(20); Query OK, 1 row affected (0.00 sec) mysql> select * from testsqlmode; +---------+ | someint | +---------+ | 10 | | 10 | | 10 | | 20 | | 20 | +---------+ 5 rows in set (0.00 sec)
CREATE TABLE inventory ( invID INT NOT NULL AUTO_INCREMENT, itemID INT NOT NULL, pot_size INT NOT NULL, price REAL NOT NULL, qoh INT NOT NULL, image VARCHAR(30), PRIMARY KEY (invID), FOREIGN KEY (itemID) REFERENCES item(itemID) ) TYPE=INNODB ; надо ли указывать размерность для INT , REAL? еще непонятно, я создаю таблицу как INNODB, а в MyphpAdmin тип MyISAM, и поменять нельзя. там нет такой опции.
Только не забудьте попробовать именно в том контексте, в котором у вас происходит ошибка, то есть прямо перед тем самым падающим запросом в скрипте. В данном случае это не играет никакой роли. REAL - если не указать вообще, то будет использоваться максимальная точность, которая возможно в системе, где установлена MySQL. INT - не надо вообще. Очень распостранённо ложное мнение, что, например INT(1) будет использовать меньше памяти и меньше "вмещать" чем INT(4). Цифра в данном случае указывает количество цифр, которые будут как минимум отображаться в некоторых ситуациях, например при использовании опции ZEROFILL. В этом примере все 3 поля вмещают и занимают одинаковую величину байтов в памяти. Код (Text): mysql> create table this_is_not_the_size (a int(1) zerofill, aa int(2) zerofill, aaaa int(4) zerofill); Query OK, 0 rows affected (0.08 sec) mysql> insert into this_is_not_the_size values (1,1,1); Query OK, 1 row affected (0.00 sec) mysql> insert into this_is_not_the_size values (22,22,22); Query OK, 1 row affected (0.00 sec) mysql> insert into this_is_not_the_size values (4444,4444,4444); Query OK, 1 row affected (0.00 sec) mysql> select * from this_is_not_the_size; +------+------+------+ | a | aa | aaaa | +------+------+------+ | 1 | 01 | 0001 | | 22 | 22 | 0022 | | 4444 | 4444 | 4444 | +------+------+------+ 3 rows in set (0.00 sec) Как видно, 4444 отлично вместилось в INT(1), то есть это не 1 байт. (а 4) Если в данном случае InnoDB у вас не встроена, либо не активирована, то MySQL самостоятельно использует для создания таблицы движок MyISAM (либо другой, который установлен у вас как стандартный, если вы ничего не меняли, то это MyISAM).
повторила ваш скрипт, все так и получается. т.е. мне надо 1. считать строку с буквами ошибочной или 2. преобразовывать ее к целому или действителльному( соответственно) и потом записывать в бд?
еще вопросы. 1. когда надо закрывать коннекшен с бд (mysql_close($con)? это надо делать, покидая каждую страницу, а на новой снова ее открывать? 2. обязательно ли делать это фри <?php mysql_free_result($rs_GetSomething); ?> в конце страницы?
1а. В стандартных скриптах закрывать не обязательно. Все подключения (mysql_connect) будут закрыты автоматически при завершении скрипта. 1б. Да, на каждой странице посещаемой пользователем надо снова подключаться к БД. Есть некоторые приемы позволяющие не дублировать этот код во всех скриптах, а держать его в одном месте. 2. Аналогично п.1а
У вас в скрипте где-то же есть строка $result = mysql_query("UPDATE ...") или похожее на неё, где вы пробуете записать '10a' в INT? Вот прямо перед этим запросом, спросите у MySQL, в каком режиме она работает на тот момент через: Код (Text): SELECT @@GLOBAL.sql_mode; Код (Text): SELECT @@SESSION.sql_mode; Выводите эти 2 значения (обратите внимание, что они могут быть просто пустыми) или записывайте их в error log или еще куда, короче с целью, как-нибудь узнать эти 2 параметра в момент (не-)исполнения вашего запроса. Не, его не надо было повторять. Это я просто для наглядности пример привёл, что может случится, и что как раз похоже по симптомам на ваш случай. Вот тут можете прочитать подробней про режим SQL. http://dev.mysql.com/doc/refman/5.0/en/ ... -mode.html Ну, можно и так и так, зависит от того, желаете ли вы как-то "спасать" плохие данные или нет. И если да, то самой базой данных или еще до этого - в PHP? Если вы в состоянии изменить ту систему, которая записывает такие данные вам в БД (другими словами, если это ваш код PHP, а не какой-то чужой, которые вы не можете править), то я лично стал бы вылавливать/править такие данные еще до их поступа в БД, прямо в PHP. То есть ваш вариант 1. Если вы хотите "прощать" такие данные, то это так же можно сделать и в PHP. Что вообще-то приводит к главному вопросу. Откуда у вас вообще эта "10а", которую вы пытаетесь записать как INT? Не прямо из входных данных GEТ/POST итд. случайно?
Einbaukueche, спасибо за объяснения. "10а" у меня просто из GEТ/POST. проверяла, что будет, если пользователь вводит неверные данные. ошибка была в другом месте, она не связана с преобразованием строки в численный данные, но я везде сделела эти преобразования, чтобы в дальнейшем чего-нибудь нового не вылезло.