Искать  
 
   
 
Работа с базой данных - проблемы с добавлением записи
Отправлено: 11 Июнь 2011 09:39 P.M.   [ Игнорировать ]
Новичок
Rank
Всего сообщений:  7
Зарегистрирован  2011-06-11

Здравствуйте.
Возникла необходимость добавить в мой сайт много однотипного контента. Чтобы не вбивать все это вручную, попробовал написать парсер. Как я понял,инфа в базу данных добавляется в такие таблицы:
exp_channel_titles - заголовки (названия записей), + канал, можно ли комментить и еще много чего.
exp_structure_listings - опять заголовки (транслитом), + канал и т.д.
exp_channel_data - собственно, контент (текст + разные параметры).
Это все мне удалось добавить в базу данных, в ней оно отображается отлично, но не выводится. Т.е. на главной появляется список (тот, что я добавлял в exp_channel_titles ), но когда выбрать любое название, то текст не выводится. Хотя в базе данных он есть, и под тем же Id. Если же открыть любую запись из админки (редактировать) и сохранить, то все отображается. Я начал искать, и увидел, что при редактировании из админки меняется еще 1 таблица - exp_security_hashes. Но я не могу понять алгоритм генерации хэша. Как он создается, подскажите пожалуйста - я понял, что там как-то на основе юникс тайм, айпи адреса и еще чего-то, но как точно? Или такой скрипт (чтоб добавлял данные в обход админке) нереально написать? Или же можно отключить как то эти хэши, чтобы скрипт мог нормально работать и без них? php знаю не очень хорошо.

Профиль
 
 
Отправлено: 11 Июнь 2011 10:09 P.M.   [ Игнорировать ]   [ # 1 ]
Member
Avatar
RankRankRank
Всего сообщений:  224
Зарегистрирован  2010-11-20

EE - далеко не лучший вариант для вашего парсера, нет, - филлера.
Возьмите любой другой легкий скрипт, и, за дело... wink

Профиль
 
 
Отправлено: 11 Июнь 2011 10:31 P.M.   [ Игнорировать ]   [ # 2 ]
Студент
RankRank
Всего сообщений:  131
Зарегистрирован  2010-12-14

@Afgan - ну почему, по моему это адекватная задача - загрузить в сайт на ЕЕ много информации.

Не отвечу на ваш вопрос, но вообще лучше использовать не прямую работу с БД, а специальный метод ядра ЕЕ для создания entry через php
$this->EE->api_channel_entries->submit_new_entry
http://expressionengine.com/user_guide/development/api/api_channel_entries.html
По поводу вашего знания php - хм, а как вы тогда парсите и записываете данные в БД сейчас ? Только при помощи SQL?
И еще - попробуйте создать 1н entry, и посмотреть в какие таблицы и в каком виде добавились данные.
Я не уверен, но кажется еще в какие то таблицы кроме тех что вы написали пишутся данные.

Профиль
 
 
Отправлено: 11 Июнь 2011 10:47 P.M.   [ Игнорировать ]   [ # 3 ]
Новичок
Rank
Всего сообщений:  7
Зарегистрирован  2011-06-11

Afgan, я не хочу брать другой, мне нравится ЕЕ, тем более дизайн и другой контент я разместил. Не хочется переделывать все с нуля, тем более что другие цмс я не знаю.

По поводу вашего знания php - хм, а как вы тогда парсите и записываете данные в БД сейчас ? Только при помощи SQL?

Нет, при помощи php, в котором уже формирую sql запрос. php парсит сайт, получает переменные. Просто я изучаю пхп всего 2-3 месяца, не знаю еще много чего (регулярки например), и мало опыта.
Api посмотрю, спасибо.

Я не уверен, но кажется еще в какие то таблицы кроме тех что вы написали пишутся данные

Только в эти, я проверял.

Профиль
 
 
Отправлено: 12 Июнь 2011 12:13 A.M.   [ Игнорировать ]   [ # 4 ]
Member
Avatar
RankRankRank
Всего сообщений:  224
Зарегистрирован  2010-11-20

Для того, чтобы постить автоматом на свои сайты, нет необходимости

изучать PHP или обучаться мастерству хаккера smile

Для этой цели достаточно задействовать встроенный в EE

стандартный механизм XML-RPC posting API.

Профиль
 
 
Отправлено: 12 Июнь 2011 02:13 P.M.   [ Игнорировать ]   [ # 5 ]
Новичок
Rank
Всего сообщений:  7
Зарегистрирован  2011-06-11

По API - подскажите пожалуйста. Я формировал примерно такие запросы:

$sql1="INSERT INTO `channel_baza`.`chm_channel_titles`
 (`site_id`,
 `channel_id`,
 `author_id`,
 `title`, 
`url_title`, 
`status`, 
`versioning_enabled`, 
`allow_comments`, 
`sticky`, `entry_date`,
 `dst_enabled`, `year`, `month`, `day`,
 `expiration_date`, `comment_expiration_date`, 
`edit_date`,`recent_comment_date`,`comment_total`)
 VALUES (1,5,3,
'"
.$array_txt_captions1."',
'"
.$translited1."', 'open', 'y', 'n', 'n', 
$un_time, 'n', $year_s,
 
$mon_s,$day_s, 0, 0, $long_date, 0, 0)";

$sql2 "INSERT INTO `channel_baza`.`chm_channel_data`
 (`site_id`, `channel_id`, `field_id_1`, 
`field_ft_1`, `field_id_2`, `field_ft_2`,
`field_id_3`, `field_ft_3`,`field_id_4`,
 `field_ft_4`,`field_id_5`, `field_ft_5`,
`field_id_6`, `field_ft_6`,`field_id_7`,
 `field_ft_7`,`field_id_9`, `field_ft_9`, `field_id_10`,
`field_ft_10`, `field_id_11`,`field_ft_11`) 
VALUES (1,5,'', NULL, '', 
NULL, '', NULL, '', NULL, '',
 NULL, '', NULL, '', NULL, '',
 NULL, '<p>"
.$text_snov1."</p>', 'none',0,'none')"

[code]$sql3="INSERT INTO `channel_baza`.`chm_structure_listings`
 (`site_id`, `entry_id`, 
`parent_id`, `channel_id`, `template_id`, `uri`)
 VALUES (1,'',13,5,9,'"
.$translited1."')"

(записал так, чтобы не растягивать форум).
В документации по Апи написано,

$this->EE->api_channel_entries->submit_new_entry((int) $channel_id, (mixed$data); 

Т.е. channel_id я должен передать здесь, site_id, как я понял, вообще не надо. А как быть с иной инфой? Ее надо передать в массиве?

$data = array(
    
'title'            => 'Breaking News Story!',
    
'entry_date'        => '1256953732',
    
'field_id_6'        => 'Some data',
    
'field_ft_6'        => 'none',
    
'field_id_19'        => 'More data',
    
'field_ft_19'        => 'xhtml'    
); 

Т.е. мне надо скопировать все данные с тех sql запросов и поместить в этот массив? А ЕЕ сам уже раскидает данные по нужным таблицам (т.к.часть инфы идет в 1 таблицу, часть во вторую). Я правильно понял?

Профиль
 
 
Отправлено: 12 Июнь 2011 07:01 P.M.   [ Игнорировать ]   [ # 6 ]
Студент
RankRank
Всего сообщений:  131
Зарегистрирован  2010-12-14

Да, вы правильно поняли.
Еще в массив можно добавить
url_title => “some_url_title”,
allow_comment => “y”

Профиль
 
 
Отправлено: 13 Июнь 2011 01:26 P.M.   [ Игнорировать ]   [ # 7 ]
Новичок
Rank
Всего сообщений:  7
Зарегистрирован  2011-06-11

MaxStoun, спасибо.
Подскажите еще пожалуйста - а куда надо вписывать этот код?

$this->EE->load->library('api'); 
$this->EE->api->instantiate('channel_entries');
$this->EE->api_channel_entries->submit_new_entry($channel_id$data); 

В плане, в чем они должны быть? Просто так не работают (просто в коде), пробовал вписывать в класс, не работает. Я не знаком с ООП в пхп, подскажите, что надо почитать, чтобы понять как работать с таким кодом? в плане, про классы, объекты, или что именно? И - нет ли примеров уже готового использования такого кода.

Профиль
 
 
Отправлено: 13 Июнь 2011 01:37 P.M.   [ Игнорировать ]   [ # 8 ]
Студент
RankRank
Всего сообщений:  131
Зарегистрирован  2010-12-14

А куда вы его вписываете сейчас ?
Если в шаблон (template) то нужно еще дописать

$this->EE =& get_instance();
$this->EE->load->library('api');
$this->EE->api->instantiate('channel_entries'); 

И еще - если он не работает - он выдает какие то ошибки ? (если на сервере включен показ ошибок)
если показ ошибок выключен, попробуйте добавить в начало файла код типа

<?php
error_reporting
(E_ALL);
ini_set('display_errors''1');
?> 
Профиль
 
 
Отправлено: 13 Июнь 2011 02:54 P.M.   [ Игнорировать ]   [ # 9 ]
Новичок
Rank
Всего сообщений:  7
Зарегистрирован  2011-06-11

Ошибки - например такие:

Fatal errorCall to undefined function get_instance() in ...\www\tested.php on line 2
Fatal error
Using $this when not in object context in ...\www\tested.php on line 3 

А в какой шаблон это надо помещать? Я просто создавал файл вида tested.php, и писал туда этот код. Так неправильно?

Профиль
 
 
Отправлено: 13 Июнь 2011 03:45 P.M.   [ Игнорировать ]   [ # 10 ]
Студент
RankRank
Всего сообщений:  131
Зарегистрирован  2010-12-14

Нет, так не правильно.
Есть 2 варианта
1 - написать этот код в шаблоне ЕЕ (через админку ЕЕ)
2 - написать модуль к ЕЕ (немного сложнее)

Попробуйте зайти в админку в Design-Templates-Template manager, и создать новый шаблон
В настройках шаблона (Edit preferences) указать Allow php = Yes


Хотя, возможно, есть способ вызывать файл PHP, который бы использовал модель ЕЕ, но я не знаю способа.

Профиль
 
 
Отправлено: 13 Июнь 2011 04:46 P.M.   [ Игнорировать ]   [ # 11 ]
Новичок
Rank
Всего сообщений:  7
Зарегистрирован  2011-06-11

Я создаю новый шаблон, пишу в него такой код:

<?php
$this
->EE = &get;_instance();
$this->EE->load->library('api');
$this->EE->api->instantiate('channel_entries'); 

$un_time=time();
$channel_id=5;
$title="Кот";
$translited="Kot";
$text_sna="тексттт";


$data = array(
    
'author_id'    => '3',
    
'title'        => '$title',
    
'url_title'    => '$translited',
    
'entry_date' => '$un_time',
    
'allow_comments' => 'n',
    
'site_id' => '1',
    
'channel_id' => '5',
    
'status' => 'open',
    
'versioning_enabled' => 'y'
    
'allow_comments' => 'n',  
    
'sticky' => 'n',    
    
'field_id_1' => '',
    
'field_ft_1' => 'NULL',
    
'field_id_2' => '',
    
'field_ft_2' => 'NULL',
    
'field_id_3' => '',
    
'field_ft_3' => 'NULL',    
    
'field_id_4' => '',
    
'field_ft_4' => 'NULL',
    
'field_id_5' => '',
    
'field_ft_5' => 'NULL',
    
'field_id_6' => '',
    
'field_ft_6' => 'NULL',
    
'field_id_7' => '',
    
'field_ft_7' => 'NULL',    
    
'field_id_9' => '',
    
'field_ft_9' => 'NULL',    
    
'field_id_10' => '$text_sna',
    
'field_ft_10' => 'none',    
    
'field_id_11' => '0',
    
'field_ft_11' => 'none'    
);
$this->EE->api_channel_entries->submit_new_entry(5$data);

    if (
$this->EE->api_channel_entries->submit_new_entry($channel_id$data) === FALSE)
     
{
    show_error
('An Error Occurred Creating the Entry');
     
}

?> 

На что опять получаю еррор
An Error Occurred Creating the Entry
Что я делаю не так? Извините за много вопросов, но не могу понять.

Профиль
 
 
Отправлено: 13 Июнь 2011 05:03 P.M.   [ Игнорировать ]   [ # 12 ]
Студент
RankRank
Всего сообщений:  131
Зарегистрирован  2010-12-14

>$this->EE = &get;_instance();
у вас тут опечатка ? у вас же лишняя точка с запятой (;)

$this->EE->api_channel_entries->submit_new_entry(5$data);
    if (
$this->EE->api_channel_entries->submit_new_entry($channel_id$data) === FALSE

Тут вы 2 раза пытаетесь создать одинаковую запись
уберите первую строку
ну или замените код на

$result $this->EE->api_channel_entries->submit_new_entry(5$data);
if (
$result === FALSE)
{
...

И еще - а запись не создается ? Проверьте через админку.

Профиль
 
 
Отправлено: 11 Июль 2011 01:36 A.M.   [ Игнорировать ]   [ # 13 ]
Студент
Avatar
RankRank
Всего сообщений:  113
Зарегистрирован  2010-08-30
Икс Кот - 13 Июнь 2011 04:46 P.M.

Я создаю новый шаблон, пишу в него такой код:

$data = array(
    
'author_id'    => '3',
    
'title'        => '$title',
    
'url_title'    => '$translited',
    
'entry_date' => '$un_time',
    
'allow_comments' => 'n',
    
'site_id' => '1',
    
'channel_id' => '5',
    
'status' => 'open',
    
'versioning_enabled' => 'y'
    
'allow_comments' => 'n',  
    
'sticky' => 'n',    
    
'field_id_1' => '',
    
'field_ft_1' => 'NULL',
    
'field_id_2' => '',
    
'field_ft_2' => 'NULL',
    
'field_id_3' => '',
    
'field_ft_3' => 'NULL',    
    
'field_id_4' => '',
    
'field_ft_4' => 'NULL',
    
'field_id_5' => '',
    
'field_ft_5' => 'NULL',
    
'field_id_6' => '',
    
'field_ft_6' => 'NULL',
    
'field_id_7' => '',
    
'field_ft_7' => 'NULL',    
    
'field_id_9' => '',
    
'field_ft_9' => 'NULL',    
    
'field_id_10' => '$text_sna',
    
'field_ft_10' => 'none',    
    
'field_id_11' => '0',
    
'field_ft_11' => 'none'    
); 

На что опять получаю еррор
An Error Occurred Creating the Entry
Что я делаю не так? Извините за много вопросов, но не могу понять.

Переменная в одинарных кавычках не обработается.

'title'        => $title,
    
'url_title'    => $translited

Далее сами поправьте.

Профиль