search by...

0 отговора 44 прегледа
#1

search by...

Здравейте.Значи ползвам един готов пример за търсене в xml ето го:

<HTML><HEAD><TITLE>Search Results</TITLE></HEAD>
<BODY><B>Резултати от търсенето</B><HR><BR>
<TABLE BORDER=1><THEAD><TR>
<TH> author </TH>
<TH> isbn </TH>
<TH> title </TH>
<TH> price </TH>
<TH> cyrrency </TH>
</TR>
</THEAD>
<TBODY valign="top">
<?php
require("newcommon.php");
$books = readBookInfo();
if (strcmp($searchBy, "isbn")== 0) {
if (($book = searchBookByISBN($books, $searchKeyword)))
printBookInfo($book["title"], $book["authors"],
$book["isbn"], $book["price"],
$book["currency"]);
} elseif (strcmp($searchBy, "author")== 0) {
for ($i=0; $i<count($books); $i++) {
$authorsValue = $books[$i]["authors"];
for($j=0; $j<count($authorsValue)-1; $j++) {
if (strcmp(strtolower(trim($authorsValue[$j])),
strtolower(trim($searchKeyword))) == 0)
printBookInfo($books[$i]["title"],
$books[$i]["authors"],
$books[$i]["isbn"], $books[$i]["price"],
$books[$i]["currency"]) ;
}
}
} else if (strcmp($searchBy, "title") == 0) {
for ($i=0; $i<count($books); $i++) {
if (strstr(strtolower(trim($books[$i]["title"])),
strtolower(trim($searchKeyword))))
printBookInfo($books[$i]["title"],
$books[$i]["authors"], $books[$i]["isbn"],
$books[$i]["price"],
$books[$i]["currency"]);
}
}
?>
</TBODY>
</TABLE>
</BODY>
</HTML>

newcommon.php
<?php
$file = "newbooks.xml";
$currentTag = "";
$titleValue = ""; // Value of the title element
$authorsValue = array(); // Array of the values of the author elements
$isbnValue = ""; // Value of the isbn element
$priceValue = ""; // Value of the price element
$currencyValue = ""; // Value of the book element's currency attribute
$descriptionValue = ""; // Value of the description entity reference
$authorCount=0; // Variable used to populate the $authorsValue array
$books = array(); // Contains the details of books.

function startElement($parser, $name, $attr) {
global $currentTag, $currencyValue;
$currentTag = $name;
if (strcmp($name, "price") == 0)
$currencyValue = $attr["currency"];
}
function endElement($parser, $name) {
global $titleValue, $authorsValue, $isbnValue, $priceValue,
$currencyValue, $books, $authorCount, $descriptionValue;
if (strcmp($name, "book") == 0) {
$books[] = array("title"=>$titleValue,
"authors" =>$authorsValue,
"isbn" => $isbnValue,
"price" =>$priceValue,
"currency" =>$currencyValue,
"description" =>$descriptionValue) ;
$titleValue = "";
$authorsValue = array();
$isbnValue = "";
$priceValue = "";
$authorCount=0;
$currencyValue="";
$descriptionValue = "";
} elseif (strcmp($name, "author")== 0) {
$authorCount++;
$authorsValue[$authorCount] = "";
}
}
function characterData($parser, $data) {
global $titleValue, $authorsValue, $isbnValue,$priceValue,
$currentTag, $authorCount;
if (strcmp($currentTag, "title") == 0) {
$titleValue .= $data;
} elseif (strcmp($currentTag, "author") == 0) {
$authorsValue[$authorCount] .= $data;
} elseif (strcmp($currentTag, "isbn") == 0) {
$isbnValue .= $data;
} elseif (strcmp($currentTag, "price") == 0) {
$priceValue .= $data;
}
}
function externalEntityHandler($parser, $entityName, $base,
$systemId, $publicId) {
global $descriptionValue;
if (!systemId)
return false;
$descriptionValue = $systemId;
return true;
}
function readBookInfo() {
global $file, $books;
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser,"characterData");
xml_set_external_entity_ref_handler($xml_parser, "externalEntityHandler");
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
if (!($fp = fopen($file, "r"))) {
die("Could not open $file for reading") ;
}
while (($data = fread($fp, 4096))) {
if (!xml_parse($xml_parser, $data, feof($fp))){
die(sprintf("XML error at line %d column %d",
xml_get_current_line_number($xml_parser),
xml_get_current_column_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
return $books;
}
function printBookInfo($titleValue, $authorsValue, $isbnValue, $priceValue,
$currencyValue) {
print "<TR>";
print "<TD>";
for($j=0; $j<count($authorsValue)-1; $j++) {
if ($j !=0)
print "";
print " $authorsValue[$j] ";
}
print "</TD>";
print "<TD>$isbnValue</TD>";
print "<TD>
$titleValue</TD>";
print "<TD>$priceValue</TD>";
print "<TD>$descriptionValue $currencyValue</TD>";
print "</TR>";
}
function searchBookByISBN($books, $isbn) {
for($i = 0; $i < count($books); $i++) {
if (strcmp(trim($books[$i]["isbn"]), trim($isbn)) == 0) {
return $books[$i];
}
}
return null;
}
?>

Ами проблема е че в title търси из цялата стоиност вътре в етикета- ако вътре е Иван Иванов и пишем само фамилията или само първото име ще го изведе като резултат, но в author търси по абсолютно съвпадение.
Ами... извинявам се за въпроса обаче Хесус Кастането и компания не са писали в книжката как да се оправи това, а и аз самият не съм програмист на php.
Много благодарен бих ви бил, ако ми помогне някой, за да може да се търси и по НЕ пълно съвпадение.
п.п. а някой може ли да предложи как да се приемат заявките и да се изпълняват независимо от големината на буквите- в момента ако в xml е заисано нещо с главни букви, в заявката ако не е също с главни не го намира

Отговор