2

私はphpとmysqlを学んでいますが、今問題に遭遇しました。

私は自動提案の php/javascript スクリプトを使用しています。このスクリプトは、基本的には html 形式でユーザー入力を取得し、javascript を使用してユーザー入力を php ファイルに送信し、そこで「LIKE」クエリ コマンドを使用してデータベースを検索します。次に、クエリで見つかった「名前」データを含むリスト項目を含む html リストを返します。

ここで私の質問:データベースに wp_terms と wp_term_taxonomy の 2 つのテーブルがあります (以下の図を参照)。現在、クエリは「wp_terms」テーブルのすべてのエントリを検索し、「name」エントリを選択します。しかし、一種のフィルターを追加したいと思います。「親」として整数「2」を持つエントリの名前のみを取得したいと考えています。

これへのアプローチは、「wp_term_taxonomy」を検索し、整数「2」を親としてエントリの「term_id」を保存することだと思います。次に、「wp_terms」テーブルを通過し、保存された「term_id」の「名前」を出力する別のクエリを作成します。

これが正しいアプローチであるかどうかはわかりません。私は何日も試しましたが、成功しませんでした。本当に助けていただければ幸いです。

データベース テーブルの図: ここに画像の説明を入力

私のautosuggest.phpコード。これは魔法が起こった場合です:

<?php
   $db_host = 'localhost';
   $db_username = 'user';
   $db_password = 'passw';
   $db_name = 'db';

   $db = new mysqli($db_host, $db_username ,$db_password, $db_name);

    if(!$db) {

        echo 'Could not connect to the database.';
    } else {

        if(isset($_POST['queryString'])) {
            $queryString = $db->real_escape_string($_POST['queryString']);

            if(strlen($queryString) >0) {

                $query = $db->query("SELECT name FROM wp_terms WHERE name LIKE '$queryString%' LIMIT 10");

                if(mysqli_num_rows($query) > 0) {
                    if($query) {
                    echo '<ul>';
                        while ($result = $query ->fetch_object()) {
                            echo '<li onClick="fill(\''.addslashes($result->name).'\');">'.$result->name.'</li>';
                        }       
                    echo '</ul>';

                    } else {
                        echo 'OOPS we had a problem :(';
                    }
                } else {
                    echo '<ul>';
                    echo '<span style="color:#0196E3";>'.$queryString.'</span> no matches found.';
                    echo '</ul>';
                }   
            } else {
                // do nothing
            }
        } else {
            echo 'There should be no direct access to this script!';
        }
    }
?>
4

1 に答える 1

0

これを行うには、 JOINを使用する必要があります。

SELECT `wp_terms`.`name`
FROM `wp_terms`
INNER JOIN `wp_term_taxonomy`
ON `wp_terms`.`term_id`=`wp_term_taxonomy`.`term_id`
AND `wp_term_taxonomy`.`parent`=2
WHERE `wp_terms`.`name` LIKE '$queryString%'
LIMIT 10

結合がどのように機能するかの視覚的な説明については、こちらをご覧ください。

基本的に、結合を行うときは、使用している結合に基づいて両方のテーブルを結合しています。このクエリは、 に基づいてテーブルを内部結合し、が 2 に等しいterm_id行のみを返すようにします。parent

ところで、実際にはPDObinding parametersを使用する必要があります。MySQLi は長い目で見ればあなたを失望させるでしょう。

于 2013-03-27T21:25:30.587 に答える