Я использую прямой поиск в AJAX для создания ссылок на конкретные профили пользователя. Он работает хорошо, я всегда оказываюсь в профиле, который хочу, но есть проблема.
Давайте сделаем это для пользователя 1 (имя пользователя = testuser; user_id = 1; blogname = testblog). Если я буду искать «тест», будут показаны обе ссылки, ссылка на профиль пользователя testuser и ссылка на блог testuser. Странная вещь сейчас, ссылки работают так, как будто они будут выглядеть так:
profile.php? пользователь = 1 & = страница профиля
profile.php? пользователь = 1 & = страница блога
но фактические ссылки выглядят так:
profile.php? пользователя =% 20 +% 201% 20% + 20 & страница = профиль
profile.php? пользователя =% 20 +% 201% 20% + 20 & страница = блога
Поскольку я заканчиваю на странице, которую я хочу, вы могли бы сказать, что это не имеет значения, но это так, потому что мне нужно, чтобы значения $ GET _ ['user'] всегда были реальными числами, а не такими вещами, которые я имеющий дело, здесь.
Надеюсь, есть простой способ исправить это. Как nodeValue-> string или что-то еще. Мне нужно изменить nodeValue в этой части кода, я думаю: $ z-> item (0) -> childNodes-> item (0) -> nodeValue
Это код, который я использую:
<?php $xmlDoc=new DOMDocument(); $xmlDoc->load("../xml/accounts.xml"); $x=$xmlDoc->getElementsByTagName('account'); //get the q parameter from URL $q=$_GET["q"]; //lookup all links from the xml file if length of q>0 if (strlen($q)>0) { $hint=""; for($i=0; $i<($x->length); $i++) { $y=$x->item($i)->getElementsByTagName('username'); $b=$x->item($i)->getElementsByTagName('blogname'); $c=$x->item($i)->getElementsByTagName('companyname'); $z=$x->item($i)->getElementsByTagName('user_id'); //search for usernames if ($y->item(0)->nodeType==1) { //find a link matching the search text if (stristr($y->item(0)->childNodes->item(0)->nodeValue,$q)) { if ($hint=="") { $hint= "<a href='profile.php?user= + " . $z->item(0)->childNodes->item(0)->nodeValue . " + &page=profile' >" . $y->item(0)->childNodes->item(0)->nodeValue . "</a><span> (profile)</span>"; } else { $hint= $hint . "<br /><a href='profile.php?user= + " . $z->item(0)->childNodes->item(0)->nodeValue . " + &page=profile' >" . $y->item(0)->childNodes->item(0)->nodeValue . "</a><span> (profile)</span>"; } } } //search for blognames if ($b->item(0)->nodeType==1) { //find a link matching the search text if (stristr($b->item(0)->childNodes->item(0)->nodeValue,$q)) { if ($hint=="") { $hint= "<a href='profile.php?user= + " . $z->item(0)->childNodes->item(0)->nodeValue . " + &page=blog' >" . $b->item(0)->childNodes->item(0)->nodeValue . "</a><span> (blog)</span>"; } else { $hint= $hint . "<br /><a href='profile.php?user= + " . $z->item(0)->childNodes->item(0)->nodeValue . " + &page=blog' >" . $b->item(0)->childNodes->item(0)->nodeValue . "</a><span> (blog)</span>"; } } } // Set output to "no suggestion" if no hint was found // or to the correct values if ($hint=="") { $response="no QuickResults, hit enter"; } else { $response=$hint; } //output the response echo $response; ?>
Внутри моего XML-файла структура выглядит так: если это помогает:
<account> <username>testuser</username> <user_id>1</user_id> <blogname>testblog</blogname> </account>
Проблема, которую вы получаете, возникает из-за того, что ваш код добавляет пробелы и знак плюса в результирующую ссылку. И пробелы автоматически кодируются как %20
. Решение состоит в том, чтобы удалить их из кода следующим образом:
$hint= "<a href='profile.php?user=" . $z->item(0)->childNodes->item(0)->nodeValue . "&page=profile' >" . $y->item(0)->childNodes->item(0)->nodeValue . "</a><span> (profile)</span>";
Это изменение необходимо будет сделать во всех четырех случаях.