Проблема в регулярных выражениях в PHP

RealFikus

С помощью регулярных выражений обрабатываю следующий XML-файл:
<?xml version="1.0" ?>
- <reply>
<submition_date>2006-02-22 11:01:40</submition_date>
<send_date />
<last_status_change_date>2006-02-22 11:01:42</last_status_change_date>
<status>Доставлено</status>
<error />
<sms_id>1111111111</sms_id>
</reply>
Вытаскиваю sms_id и status с помощью следующего кода:

$pattern = "#<status>[^<]+</status>#i";
$result = preg_match_all($pattern, $r, $out, PREG_SET_ORDER);
$status = $out[0][0];

$pattern = "#<sms_id>[^<]+</sms_id>#i";
$result = preg_match_all($pattern, $r, $out, PREG_SET_ORDER);
$sms_id = file_get_contents($out[0][0]);

$r содержит вышеприведенный XML.
Затем выполняю запрос обновления к существующей таблице MySQL:

$query = "UPDATE main SET status = $status WHERE sms_id = $sms_id";
$thm = mysql_query($query);

В таблице main точно есть соответсвующий sms_id, но обновления не происходит.
Если напечатать $query через echo. Запрос выглядит так как и должен. Если его скопировать и вставить в phpMyAdmin, то он выполниться. Я так думаю, что дело в типе данных, но не разобрался как их привести.В MySQL у полей sms_id и status тип tinytext.
Заранее благодарен за помощь.

uncle17

а зачем tinytext? Чем не катит varchar или вообще int? Я так полагаю, sms_id - число?

uncle17

да, и $status закавычить не мешало бы

RealFikus

10-ти значное число, и данный XML получается извне и ничего не мешает ему завтра стать 20-ти значным, так что проще текст хранить. Своего места не очень жалко.

artimon

Если напечатать $query через echo. Запрос выглядит так как и должен.
Не-а. Посмотри на исходный код странички и ты увидишь там
<sms_id>1111111111</sms_id>

Просто браузер не показывает неизвестные теги.

RealFikus

Закавычкание не решает проблемы Но все равно зпасибо за замечание.

artimon

Ээээ....
А зачем здесь file_get_contents?

RealFikus

Точно не печатает теги. До самого очевидного взглянуть в исходник я и не догадался. А можно как-то решить эту проблему? (Вытаскивать именно серединку)

artimon

$pattern = "#<status>([^<]+)</status>#i"; 
$result = preg_match_all($pattern, $r, $out, PREG_SET_ORDER);
$status = $out[0][1];

RealFikus

Это я не оттуда строчку скопировал. должно быть так же как и 3-мя строчками выше.

artimon

RTFM

RealFikus

Ничего не понимаю. Сделал вот так:

$pattern = "#<status>([^<]+)</status>#i";
$result = preg_match_all($pattern, $r, $out, PREG_SET_ORDER);
$status = $out[0][1];

$pattern = "#<sms_id>([^<]+)</sms_id>#i";
$result = preg_match_all($pattern, $r, $out, PREG_SET_ORDER);
$sms_id = $out[0][0];
echo "Статус: " . $status . " Id: " . $sms_id;

Смотрю в исходник и вижу:
Статус: Delivered Id: <sms_id>1021494518</sms_id>
Почему? Извиняюсь за беспокойство.

artimon

$sms_id = $out[0][1];

RealFikus

Всем спасибо. Сам увидел. Еще раз извиняюсь.

RealFikus

Добрый день! Хочется еще проконсультироваться. Оказывается XML-документ может быть не только таким:
<?xml version="1.0" ?> 
- <reply>
<submition_date>2006-02-22 11:01:40</submition_date>
<send_date />
<last_status_change_date>2006-02-22 11:01:42</last_status_change_date>
<status>Доставлено</status>
<error />
<sms_id>1111111111</sms_id>
</reply>

Но и таким:
  <?xml version="1.0" ?> 
- <reply>
<submition_date>2006-02-22 11:01:40</submition_date>
<send_date />
<last_status_change_date>2006-02-22 11:01:42</last_status_change_date>
<status />
<error />
<sms_id>1111111111</sms_id>
</reply>

В последнем случае следующий кусок кода выдает ошибку на последней строчке:
$pattern = "#<status>([^<]+)</status>#i";
$result = preg_match_all($pattern, $r, $out, PREG_SET_ORDER);
$status = $out[0][1];

Можно ли как-то изменить шаблон? Заранее спасибо за помощь.

artimon

$pattern = "#<status>([^<]+)</status>#i";
$result = preg_match_all($pattern, $r, $out, PREG_SET_ORDER);
if ($result) {
$status = $out[0][1];
} else {
$status = ''; # здесь надо написать что-то для случая <status />
}

RealFikus

Спасибо.
Оставить комментарий
Имя или ник:
Комментарий: