Проблема в регулярных выражениях в PHP
а зачем tinytext? Чем не катит varchar или вообще int? Я так полагаю, sms_id - число?
да, и $status закавычить не мешало бы
10-ти значное число, и данный XML получается извне и ничего не мешает ему завтра стать 20-ти значным, так что проще текст хранить. Своего места не очень жалко.
Если напечатать $query через echo. Запрос выглядит так как и должен.Не-а. Посмотри на исходный код странички и ты увидишь там
<sms_id>1111111111</sms_id>
Просто браузер не показывает неизвестные теги.
![](/images/graemlins/frown.gif)
А зачем здесь file_get_contents?
![](/images/graemlins/smile.gif)
$pattern = "#<status>([^<]+)</status>#i";
$result = preg_match_all($pattern, $r, $out, PREG_SET_ORDER);
$status = $out[0][1];
Это я не оттуда строчку скопировал. должно быть так же как и 3-мя строчками выше.
![](/images/graemlins/frown.gif)
$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>
Почему?
![](/images/graemlins/frown.gif)
$sms_id = $out[0][1];
![](/images/graemlins/smile.gif)
<?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];
Можно ли как-то изменить шаблон? Заранее спасибо за помощь.
$pattern = "#<status>([^<]+)</status>#i";
$result = preg_match_all($pattern, $r, $out, PREG_SET_ORDER);
if ($result) {
$status = $out[0][1];
} else {
$status = ''; # здесь надо написать что-то для случая <status />
}
Спасибо.
Оставить комментарий
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 с помощью следующего кода:
$r содержит вышеприведенный XML.
Затем выполняю запрос обновления к существующей таблице MySQL:
В таблице main точно есть соответсвующий sms_id, но обновления не происходит.
Если напечатать $query через echo. Запрос выглядит так как и должен. Если его скопировать и вставить в phpMyAdmin, то он выполниться. Я так думаю, что дело в типе данных, но не разобрался как их привести.В MySQL у полей sms_id и status тип tinytext.
Заранее благодарен за помощь.