-1

列の1つがキーワードと一致する場合、各行のデータベース内のすべての列を返すスクリプトを作成しようとしています。たとえば、以下の例では、単語 tap に一致するすべての行が返されます。次に、結果を xml としてレンダリングします。以下のコードは機能しているようで、totalResults は見つかった一致の数を示しています。各結果をループして、一致したすべてのデータを SQL クエリでレンダリングするにはどうすればよいですか?

   $query = 'tap';

    //connect to the database
$db = new mysqli('localhost', $username, $password, $database );
if($db->connect_errno > 0){
    die('Unable to connect to database [' . $db->connect_error . ']');
}

//query the database    
$sqlQuery = "select * from skus
where
`id` like '%$query%' OR
`name` like '%$query%' OR
`description` like '%$query%' OR
`ean` like '%$query%' OR
`price` like '%$query%' OR
`wasPrice` like '%$query%' OR
`deliveryCost` like '%$query%' OR
`deliveryTime` like '%$query%' OR
`stockAvailability` like '%$query%' OR
`skuAvailableInStore` like '%$query%' OR
`skuAvailableOnline` like '%$query%' OR
`channel` like '%$query%' OR
`manufacturersPartNumber` like '%$query%' OR
`specificationsModelNumber` like '%$query%' OR
`featuresBrand` like '%$query%' OR
`imageUrl` like '%$query%' OR
`thumbnailUrl` like '%$query%' OR
`features` like '%$query%' OR
`url` like '%$query%' OR
`productHierarchy` like '%$query%'";
if(!$result = $db->query($sqlQuery)){
    die('There was an error running the query [' . $db->error . ']');
}

    Header('Content-type: text/xml');

echo '<?xml version="1.0" encoding="utf-8"?>';

echo '<totalResults>Total results: ' . $result->num_rows . '</totalResults>';

//close the database connection
$db->close();
4

3 に答える 3

2

あまり具体的に聞かないので、大雑把に答えます。

非常使いやすいmysqli_resultオブジェクトを反復処理することにより、Mysqli クエリの結果をループします (現在の非 End-Of-Live バージョンの PHP は 5.4 と 5.5 です) 。Traversable

foreach ($result as $row) 
{
    ...

XML 出力の場合は、必要に応じてXMLWriterライブラリを使用する必要があります。たとえばforeach、すぐ上の例では次のようになります。

foreach($result as $row)
{
    $writer->startElement('sku');

    foreach($row as $name => $value) {
        $writer->startElement($name);
        $writer->text($value);
        $writer->endElement();
    }

    $writer->endElement();
}

一目でわかる完全な例 (私の場合は SQL クエリとデータベースが異なりますが、それによって頭痛の種になることはないと思います):

$mysql = new Mysqli('localhost', 'testuser', 'test', 'test');
if ($mysql->connect_errno) {
    throw new Exception(sprintf("Mysqli: (%d): %s", $mysql->connect_errno, $mysql->connect_error));
}

$sqlQuery = 'SELECT * FROM config';
if (!$result = $mysql->query($sqlQuery)) {
    throw new Exception(sprintf('Mysqli: (%d): %s', $mysql->errno, $mysql->error));
}

header('Content-type: text/xml');
$writer = new XMLWriter();

$writer->openUri('php://output');
$writer->startDocument();
$writer->startElement('results');
$writer->startElement('skus');

foreach($result as $row)
{
    $writer->startElement('sku');

    foreach($row as $name => $value) {
        $writer->startElement($name);
        $writer->text($value);
        $writer->endElement();
    }

    $writer->endElement();
}

$writer->endDocument();

お役に立てれば。PHP 5.4 をまだ持っていない場合は、入手してください。それが問題である場合は、 「PHP mysqli_result: Use Traversable interface with fetch_object」への回答で概説されているように、Mysqli の結果を他の PHP バージョンのイテレータに変換することもできます。問題が発生する場合はお知らせください。

于 2013-06-30T11:09:54.943 に答える
-1

$result は、クエリから見つかった各列の配列を返します。

したがって、次のように配列をループするだけです。

//loop through all columns of the result

foreach($result as $key => $value)

{

      // Output : { key : "name", value : "tap" } if "name" === "tap"

      echo "{ key : " . $key . ", result : " + $value + "}";

}

必要に応じてxmlに挿入するだけです

于 2013-06-29T23:29:23.163 に答える