Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запись массива в базу данных
 
 автор: Kien   (24.07.2007 в 13:23)   письмо автору
 
 

Добрый ден, ест вот такая страница, которая грабит определенную таблицу и генерит много-много массивов.

Вопрос вот в 4ем: как эти массивы запихнуть в БД?

Вот код страницы.:

<?php 

  
include ('config.php');


$s file_get_contents('http://www.zlatynuz.cz/result.htm'); 
 
preg_match_all("#<tr>(.*?)</tr>#si",$s,$out); 
  
$records = array(); 
  foreach(
$out[1] as $t_string){ 
      
preg_match_all("#<font.*?>(.*?)<#si",$t_string,$values); 
      
$records[] = $values[1]; 
  } 


  echo 
"<pre>"
  
print_r($records); 
  
$records serialize($records); 
  echo 
$records."\n"
  
$records unserialize($records); 
  
print_r($records); 
  echo 
"</pre>"

?>




В таблице в базе есть 22 поля. В каждом массиве тоже 22 элемента. Меня интересует запрос.

Точнее нaдо сделать так, что при изменении инфы на удаленном сайте, откуда все грабиться, автоматически обновлялась моя база через эту страницу.

Заранее благодарен

P.S.

Я написал запрос к БД, но не знаю куда его запихнуть

<?php
foreach ($records as $key => $values) { 
    
$query "INSERT INTO records VALUES ( 
'"
.$values[5]."', '".$values[0]."', '".
$values[16]."', '".$values[15]."', '".
$values[6]."', '".$values[7]."', '".
$values[19]."', '".$values[9]."', '".
$values[10]."', '".$values[8]."', '".
$values[7]."', '".$values[10]."', '".
$values[5]."', '".$values[5]."', '".
$values[14]."', '".$values[15]."', '".
$values[16]."', '".$values[17]."', '".
$values[18]."',  '".$values[19]."', '".
$values[20]."', '".$values[21]."', '".
$values[22]."')"

?>

   
 
 автор: Trianon   (24.07.2007 в 13:26)   письмо автору
 
   для: Kien   (24.07.2007 в 13:23)
 

ключевое поле в массиве есть?
поле, которым можно идентифицировать строки в БД.

   
 
 автор: Kien   (24.07.2007 в 13:51)   письмо автору
 
   для: Trianon   (24.07.2007 в 13:26)
 

есть. значение $values[5] - это номер. У каждого свой.

   
 
 автор: Trianon   (24.07.2007 в 13:59)   письмо автору
 
   для: Kien   (24.07.2007 в 13:51)
 

тогда просто создавайте запросы

$sql0 = REPLACE INTO tbl (col1,col2,.....col22) VALUES ";
foreach($arr as $row)
{
    $r = array();
    foreach($row as $col)
        $r[] = "'".mysql_escape_string($col)."'";
    $r = '('.explode(',', $r).')'
    mysql_query($sql0 .$r);
}

   
 
 автор: Kien   (24.07.2007 в 14:10)   письмо автору
 
   для: Trianon   (24.07.2007 в 13:59)
 

Че-то пишет ошибку в этой строке:


$sql0 = REPLACE INTO tbl (col1,col2,.....col22) VALUES "; 

   
 
 автор: Trianon   (24.07.2007 в 15:01)   письмо автору
 
   для: Kien   (24.07.2007 в 14:10)
 

А если после знака равенства поставить кавычку?

   
 
 автор: Kien   (25.07.2007 в 14:17)   письмо автору
 
   для: Trianon   (24.07.2007 в 15:01)
 

похоже с кавычками 4то-то, но я как-то не могу понять где.


Вот код

$sql0 = "REPLACE INTO rec (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 ) VALUES"; 
foreach($arr as $row) 

    $r = array(); 
    foreach($row as $col) 
        $r[] = "'".mysql_escape_string($col)."'"; 
    $r = '('.explode(',', $r).')' 
    mysql_query($sql0 .$r); 




Вот ошибка:

Parse error: syntax error, unexpected T_STRING in /data2/zlatynuz/html/3.php on line :


    mysql_query($sql0 .$r); 

   
 
 автор: Trianon   (25.07.2007 в 14:48)   письмо автору
 
   для: Kien   (25.07.2007 в 14:17)
 

так исправьте. Точку-с-запятой сложно поставить чтоли?

   
 
 автор: Kien   (25.07.2007 в 15:14)   письмо автору
 
   для: Trianon   (25.07.2007 в 14:48)
 

Пардон, как-то затупил.....

Теперь пишет ошибку мол Column count doesn't match value count at row 1


Это может быть только со стороны базы (количество ячеек в таблице) или с кодом тоже могут бть проблемы?

   
 
 автор: Kien   (26.07.2007 в 13:19)   письмо автору
 
   для: Kien   (25.07.2007 в 14:17)
 

Поднимаю тему опять:

Все-таки не работает запись в базу.

ПОля массивов надо записать под определенными именами столбцов. Типа ID, DATE, NAME, SURNAME и т.д. Т.е. каждый массив в одну строку.

Помогите пожалуйста, горю. До понедельника надо сделать.

структура таблицы такова:


    id           |    date        |   name        |      ........         | 
array[0][5] | array[0][0] |  array[0][6]  |   array[0][...]  |
array[1][5] | array[1][0] |  array[1][6]  |   array[1][...]  |



Вот как выглядят массивы:


Array
(
    [0] => Array
        (
            [0] => 01/07/2007 
            [1] => 2131422
            [2] => 2131422
            [3] => Transfer Delivered  To Recv Branch
            [4] => 0102131422 
            [5] => 061666DE
            [6] => OLENA    KOZLOVSKA
            [7] => 562/147 CERNOKOSTELECKA PRAHA CZ, 15000, CZ
            [8] => +420608110243
            [9] => GALYNA    TSYGULSKA
            [10] => N
            [11] => N
            [12] => 9701.00
            [13] => 0.05
            [14] => 291.00
            [15] => USD
            [16] => 450.00
            [17] => Ukraine
            [18] => Ukrsibbank 22, Blukhera Str. Kharkov
            [19] => Russlav Bank (C.I.S)
            [20] => Infobus-I
            [21] => 13/10 Pod vytopnou
            [22] => czinfobusaa
        )




    [1] => Array
        (
            [0] => 01/07/2007 
            [1] => 2131423
            [2] => 2131423
            [3] => Paid
            [4] => 0102131423 
            [5] => 061666DF
            [6] => MYKHAYLO          CHUDNYY 
            [7] => 3/498  U HELLADY  PRAHA 4   , N , CESKA REPUBLIKA 
            [8] => 608068087
            [9] => VALENTYNA       CHUDNA
            [10] => 453770
            [11] => N
            [12] => 10779.00
            [13] => 0.05
            [14] => 323.00
            [15] => USD
            [16] => 500.00
            [17] => Ukraine
            [18] => Ukrsibbank 270, Shevchenko Blv. Cherkassy
            [19] => Russlav Bank (C.I.S)
            [20] => Infobus-Iv
            [21] => 13/10 Pod vytopnou
            [22] => czinfobusad
        )

    [2] => Array
        (
            [0] => 01/07/2007 
            [1] => 2131426
            [2] => 2131426
            [3] => Transfer Delivered  To Recv Branch
            [4] => 0102131426 
            [5] => 061666E2
            [6] => VASYL         BOVHYRYA
            [7] => 82 MASARYKOVO NAM. BELA POD BEZDEZEM  , N, CZ
            [8] => 776667569
            [9] => KATERYNA       BOVGYRYA
            [10] => 00380509129968
            [11] => KSYUKHA
            [12] => 14445.00
            [13] => 0.05
            [14] => 433.00
            [15] => USD
            [16] => 670.00
            [17] => Ukraine
            [18] => Nadra Bank 6, Nezavisimosti Sq. Dubno
            [19] => Russlav Bank (C.I.S)
            [20] => Infobus-I
            [21] => 13/10 Pod vytopnou
            [22] => czinfobusaa
        )
)

   
 
 автор: Trianon   (26.07.2007 в 13:22)   письмо автору
 
   для: Kien   (26.07.2007 в 13:19)
 

Вам осталось перечислить 23 точных имени столбца таблицы. Так?

UPD. И еще переделать формат столбца с датой.

   
 
 автор: Kien   (26.07.2007 в 14:32)   письмо автору
 
   для: Trianon   (26.07.2007 в 13:22)
 

я сделал, но он записывает только дату и то в формате 00-00-0000.

Я дико извиняюсь за то, что отвлекаю такими вопросами, но просто не особо в этом разбираюсь...

   
 
 автор: Trianon   (26.07.2007 в 14:51)   письмо автору
 
   для: Kien   (26.07.2007 в 14:32)
 

Вы столбцы перечислите наконец, или нет?
А лучше - приведите дамп структуры таблицы (закладка Export в phpMyAdmin)

   
 
 автор: Kien   (26.07.2007 в 19:11)   письмо автору
 
   для: Trianon   (26.07.2007 в 14:51)
 

Вот дамп


CREATE TABLE `rec` (
  `trans_date` date NOT NULL default '0000-00-00',
  `send_trans_id` varchar(10) NOT NULL default '',
  `rec_trans_id` varchar(10) NOT NULL default '',
  `status` varchar(15) NOT NULL default '',
  `id` varchar(20) NOT NULL default '',
  `code` varchar(20) NOT NULL default '',
  `sender` varchar(50) NOT NULL default '',
  `sender_adres` varchar(100) NOT NULL default '',
  `sender_phone` varchar(20) NOT NULL default '',
  `reciever` varchar(50) NOT NULL default '',
  `reciever_phone` varchar(20) NOT NULL default '',
  `password` varchar(20) NOT NULL default '',
  `sent_amount` varchar(20) NOT NULL default '',
  `exchange_rate` varchar(5) NOT NULL default '',
  `comission` varchar(10) NOT NULL default '',
  `currency` varchar(20) NOT NULL default '',
  `payout_amount` varchar(20) NOT NULL default '',
  `country` varchar(20) NOT NULL default '',
  `receiving_branch` varchar(100) NOT NULL default '',
  `receiving_agent` varchar(100) NOT NULL default '',
  `sending_agent` varchar(100) NOT NULL default '',
  `sending_branch` varchar(100) NOT NULL default '',
  `sending_operator` varchar(100) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

   
 
 автор: Trianon   (26.07.2007 в 19:30)   письмо автору
 
   для: Kien   (26.07.2007 в 19:11)
 

первая строка кода:

$sql0 = "REPLACE INTO rec (`trans_date`
,`send_trans_id`
,`rec_trans_id`
,`status`
,`id`
,`code`
,`sender`
,`sender_adres`
,`sender_phone`
,`reciever`
,`reciever_phone`
,`password`
,`sent_amount`
,`exchange_rate`
,`comission`
,`currency`
,`payout_amount`
,`country`
,`receiving_branch`
,`receiving_agent`
,`sending_agent`
,`sending_branch`
,`sending_operator`
) VALUES";



замена даты с европейского на восточный формат:

$d = explode('/',$col);
$d = sprintf("%04d-%02d-%02d", $d[2], $d[1], $d[0]);

   
 
 автор: Kien   (30.07.2007 в 13:13)   письмо автору
 
   для: Trianon   (26.07.2007 в 19:30)
 

млин, все равно не пишет.
Может дело в этом цикле?


foreach($records as $row) 

    $r = array(); 
    foreach($row as $col) 
        $r[] = "'".mysql_escape_string($col)."'"; 
    $r = '('.explode(',', $r).')';
    mysql_query($sql0 .$r); 

   
 
 автор: Trianon   (30.07.2007 в 13:34)   письмо автору
 
   для: Kien   (30.07.2007 в 13:13)
 

я бы не стал гадать на кофейной гуще, а посмотрел.
заменив строку mysql_query($sql0 .$r);
на
mysql_query($sql = $sql0.$r) or die(""Error in $sql : ".mysql_error()); 

   
 
 автор: Kien   (30.07.2007 в 13:42)   письмо автору
 
   для: Trianon   (30.07.2007 в 13:34)
 



Error in REPLACE INTO rec (`trans_date` ,`send_trans_id` ,`rec_trans_id` ,`status` ,`id` ,`code` ,`sender` ,`sender_adres` ,`sender_phone` ,
`reciever` ,`reciever_phone` ,`password` ,`sent_amount` ,`exchange_rate` ,`comission` ,`currency` ,
`payout_amount` ,`country` ,`receiving_branch` ,`receiving_agent` ,`sending_agent` ,`sending_branch` ,
`sending_operator` ) VALUES(Array) : Column count doesn't match value count at row 1


Что бы это могло значить?

   
 
 автор: Faraon   (30.07.2007 в 14:01)   письмо автору
 
   для: Kien   (30.07.2007 в 13:42)
 

Скорее всего количество заменяемых записей больще количества столбцов

   
 
 автор: Trianon   (30.07.2007 в 14:02)   письмо автору
 
   для: Kien   (30.07.2007 в 13:42)
 

explode на implode поменяйте.

   
 
 автор: Kien   (30.07.2007 в 14:42)   письмо автору
 
   для: Trianon   (30.07.2007 в 14:02)
 

Заработало, спасибо огромное за помощь!!!!

А можно ли сделать так, чтобы в базе записи заменялись а не добовлялись при обновлении страницы?

   
 
 автор: Trianon   (30.07.2007 в 14:59)   письмо автору
 
   для: Kien   (30.07.2007 в 14:42)
 

они должны заменяться.
Как минимум, если первичный ключ сохраняет свое значение.

   
 
 автор: Kien   (30.07.2007 в 15:12)   письмо автору
 
   для: Trianon   (30.07.2007 в 14:59)
 

Класс, спасибо большое, все работает!!!

   
 
 автор: Trianon   (30.07.2007 в 15:23)   письмо автору
 
   для: Kien   (30.07.2007 в 15:12)
 

а вот формат даты Вы, пожоже, не поменяли.

   
 
 автор: Kien   (30.07.2007 в 15:28)   письмо автору
 
   для: Trianon   (30.07.2007 в 15:23)
 

А дата нужна просто для отчета. Поиска по ней не будет.


И еще такой вопрос: PHP код в XML вставляeтся также как и вHTML?

   
 
 автор: Trianon   (30.07.2007 в 15:31)   письмо автору
 
   для: Kien   (30.07.2007 в 15:28)
 

какая разница, для чего она нужна, если она У Вас формируется некорректно, и вполне вероятно, что некоторые записи из-за этого попадать в таблицу не будут?

   
 
 автор: Trianon   (30.07.2007 в 15:34)   письмо автору
 
   для: Kien   (30.07.2007 в 15:28)
 

>И еще такой вопрос: PHP код в XML вставляeтся также как и вHTML?
Я бы ответил так:
XML-код формируется с помощью php-скриптов точно также как и HTML.

   
 
 автор: Kien   (30.07.2007 в 15:41)   письмо автору
 
   для: Trianon   (30.07.2007 в 15:34)
 

Просто надо сделать с базы вывод в XML страницу.....

Это можно сделать с запросами к базе через PHP?

   
 
 автор: Trianon   (30.07.2007 в 15:52)   письмо автору
 
   для: Kien   (30.07.2007 в 15:41)
 

конечно.

   
 
 автор: Kien   (30.07.2007 в 15:59)   письмо автору
 
   для: Trianon   (30.07.2007 в 15:52)
 

Спасибо за помощь

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования