Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Запись массива в БД MySQL
Форумы портала PHP.SU » PHP » Программирование на PHP » Запись массива в БД MySQL

Страниц (2): [1] 2 »
 

1. Curse - 10 Октября, 2010 - 22:22:49 - перейти к сообщению
Подскажите, пожалуйста, как записать массив, полученный функцией preg_match в базу данных MySQL.
Массив типа:
[Bindable] => Bind on Acquire
[Equipment_Slot] => Light Armour
[Armour_Value] => 56 Armour

Пробовал
PHP:
скопировать код в буфер обмена
  1. <?PHP $sql = "INSERT INTO En_Cloaks (`" . implode("`, `",array_keys($result))."`) VALUES('".implode("','", array_values($result))."');";
  2. echo mysql_error();
  3. ?>

Не получилось
2. OrmaJever - 10 Октября, 2010 - 23:57:02 - перейти к сообщению
Можно например цыклом...
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $array = array('1' => 'a', '2' => 'b');
  3.  
  4. foreach($array as $key => $value)
  5. {
  6.  mysql_query("INSERT INTO En_Cloaks (key, value) values ('".$key."', '".$value."')";
  7. }
  8. ?>

это если я правельно понял))
3. Curse - 11 Октября, 2010 - 00:13:11 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  $cod = file_get_contents('mysite/index');
  3.     $regexps = array(
  4.        набираю массив регулярными выражениями
  5.    );
  6.    foreach ($regexps as $key => $exp)
  7.        if (preg_match($exp, $cod, $match)) $result[$key] = $match[1];
  8. ?>
  9.  
  10. <pre>
  11. <?PHP print_r($result); ?>
  12. </pre>
  13. //полученный массив выводится нормально
  14.  
  15. <?PHP
  16. $sql = "INSERT INTO En_Cloaks (`" . implode("`, `",array_keys($result))."`) VALUES('".implode("','", array_values($result))."');";
  17. echo mysql_error();
  18. //ничего не происходит
  19. ?>

строка
PHP:
скопировать код в буфер обмена
  1.  mysql_query("INSERT INTO En_Cloaks (key, value) values ('".$key."', '".$value."')";

выдает Parser Error
Я хочу записать массив $result в Базу данных.
[Bindable] => Bind on Acquire
[Equipment_Slot] => Light Armour
[Armour_Value] => 56
Слова в квадратных скобках - поля таблицы, после знака => значения.
4. Uchkuma - 11 Октября, 2010 - 08:34:08 - перейти к сообщению
Curse пишет:
Пробовал
...
Не получилось
Curse, где в вашем листинге вызов mysql_query?

Curse пишет:
выдает Parser Error
Забыли закрыть скобку у функции. Но все равно это неверный вариант.
OrmaJever пишет:
Можно например цыклом...
Неверный вариант.
5. Curse - 11 Октября, 2010 - 14:50:42 - перейти к сообщению
Uchkuma пишет:
Curse, где в вашем листинге вызов mysql_query?

Выше в коде
PHP:
скопировать код в буфер обмена
  1.  $db  =  "";  //Имя  базы  данных
  2.     $user  =  "";  //Пользователь  сервера  баз  данных
  3.     $pass  =  "";  //Пароль
  4.     $server  =  "localhost";  //Имя  сервера
  5.     //Создание  соединения
  6.     $link  =  mysql_connect($server,  $user,  $pass);
  7.     if(!$link)  die("Не  могу  соединиться  с  MySQL");
  8.     mysql_select_db($db)  or  die("Не  могу  открыть  $db:  ".mysql_error());

Далее идёт код, приведенный в предыдущем сообщении.
6. Uchkuma - 11 Октября, 2010 - 15:03:04 - перейти к сообщению
Я, наверное, слепой. Ткните пальцем, в какой строке?
7. Curse - 11 Октября, 2010 - 20:19:19 - перейти к сообщению
Uchkuma пишет:
Я, наверное, слепой. Ткните пальцем, в какой строке?

Извините, я на тот момент менял код:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. mysql_query("INSERT INTO En_Cloaks (`" . implode("`, `",array_keys($result))."`) VALUES('".implode("','", array_values($result))."');");
  3. echo mysql_error();
  4. ?>


Выдавал: 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 's Cloak','Bind on Acquire','Light Armour ','56')' at line 1
8. Uchkuma - 11 Октября, 2010 - 20:56:51 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. mysql_query("INSERT INTO En_Cloaks (`" . implode("`, `",array_keys($result))."`) VALUES('".mysql_real_escape_string(implode("','", array_values($result)))."');");
В названии пальто попалась одинарная кавычка.
(Добавление)
Я погорячился. Так не прокатит, конечно же. Экранировать надо каждое название в отдельности, а не всю сформированную строку целиком.
9. Curse - 11 Октября, 2010 - 21:13:19 - перейти к сообщению
Спасибо, теперь проблема, появляется сообщение "Column count doesn't match value count at row 1"
первое поле у меня ID, Not Null, AutoIncrement, Unique, Primary Key, тип:integer 11.
Разве параметр AutoIncrement не должен автоматически присваивать записи номер?
10. Uchkuma - 11 Октября, 2010 - 23:08:23 - перейти к сообщению
Curse пишет:
Разве параметр AutoIncrement не должен автоматически присваивать записи номер?
При чем тут это? Вам говорят "количество столбцов не совпадает с количеством значений".
11. zardoz - 12 Октября, 2010 - 02:07:05 - перейти к сообщению
Curse, эффективнее будет собрать нужную строку-команду и выполнить одним запросом, например.
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO En_Cloaks (Bindable, Equipment_Slot, Armour_Value)
  2. SELECT "Bind on Acquire","Light Armour","56" UNION ALL
  3. SELECT "Bind on Acquire1","Dark Armour","66" UNION ALL
  4. SELECT "Bind on Acquire2","Blue Armour","76" UNION ALL
  5. ...
  6. SELECT "Bind on Acquire90","Green Armour","156"

1-ую строку присваиваете до начала цикла.
Остальные прибавляете к строке в цикле. Полученное выражение используете 1 раз в запросе mysql_query().

С уважением.
P.S. При полученном целиком SQL-запросе проще и ошибки высмотреть.
12. Curse - 12 Октября, 2010 - 05:56:15 - перейти к сообщению
Uchkuma, я предполагал, что команда действует следующим образом: INSERT INTO имя таблицы (список полей через запятую) VALUES(список значений через запятую);
То есть не тронутым полям присваивается значение по умолчанию... я не прав?

zardoz, да было бы проще, но за 1 цикл я получаю только 1 строку таблицы
PHP:
скопировать код в буфер обмена
  1.  $cod = file_get_contents('http://localhost/Armour:Harbinger%27s_Cloak');
  2.     $regexps = array(
  3.         массив
  4.    );


В массив набираются найденные значения по типу "[Имя поля] => значение". И заранее я не знаю, какие поля существуют в документе, а каких нет. После прохождения по документу мне нужно записать данные массива в таблицу.
Какие то поля остаются без значений. Что в таком случае делать?
13. zardoz - 12 Октября, 2010 - 20:35:48 - перейти к сообщению
Curse пишет:
То есть не тронутым полям присваивается значение по умолчанию... я не прав?

Значение по умолчанию присваивается полям которые не перечислены в списке полей INSERT INTO имя таблицы (список полей через запятую).... Если поле указано в этом списке то нужно задать ему значение в VALUES(список значений через запятую)

Curse пишет:
И заранее я не знаю, какие поля существуют в документе

Не понял И что вы делаете с полями которых еще нет в БД но есть в документе?

С уважением.
14. Uchkuma - 12 Октября, 2010 - 21:03:17 - перейти к сообщению
Curse, выведите мне echo уже сформированной строки запроса.
15. Curse - 12 Октября, 2010 - 21:05:23 - перейти к сообщению
я не могу перечислить список полей через запятую, потому что не знаю какие из них окажутся с пустыми значениями в массиве.
zardoz пишет:
И что вы делаете с полями которых еще нет в БД но есть в документе?

В БД все поля есть, а вот в массив заносятся только те поля, которым присвоены данные, найденные в документе. Поэтому и возникла проблема с записью массива. MySQL видимо ждет данных по всем полям, а на запись идут только поля со значениями.
(Добавление)
Uchkuma пишет:
Curse, выведите мне echo уже сформированной строки запроса.

Извините, как это сделать?

 

Powered by ExBB FM 1.0 RC1