0

MySQL から取得したデータに基づいて連鎖選択ボックスを構築する次のコード スニペットがあります。

最初の選択では、PartTypeDescription という列で DISTINCT を使用します。このコードは、列の値が本質的に数値である場合にうまく機能します (例: 11)。最初の選択を選択すると、2番目の選択が必要に応じて入力されます。

この問題は、データがテキストの場合に発生します (例: 配管)。たとえば、Plumbing を選択すると、2 番目の選択ボックスは空になります。2 番目の選択ボックスを作成する 2 番目のクエリが正しく機能していないと想定しています。以下のコードに、テキスト値を許可しないものはありますか?

/* Configure the select boxes */

if (isset($_GET['key'])) {
    $key = $_GET['key'];
    switch ($key) {
        case 'callTypeSelect':
            $select = new SelectBox('What vehicle are you working from?','Choose a vehicle');
            $res = mysql_query('SELECT DISTINCT PartTypeDescription FROM ' . DB_TABLE2);
            $callTypes = array();
            for ($i = 0; list($callType) = mysql_fetch_row($res); $i++) {
                $callTypes[] = $callType;
                $select->addItem($callType, 'brandSelect-' . $callType);
            }
            header('Content-type: application/json');
            echo $select->toJSON();
            break;
        default:
            if (strpos($key, 'brandSelect-') === 0) {
                $callType = str_replace('brandSelect-', '', $key);
                $resBrands = mysql_query('SELECT Invm_InventoryNumber FROM ' . DB_TABLE2
                    . ' WHERE PartTypeDescription  = ' . mysql_real_escape_string($callType) . " ORDER BY Invm_InventoryNumber");
                $select = new SelectBox('What part number are you looking for?', 'Pick a part');
                for ($i = 0; list($brand) = mysql_fetch_row($resBrands); $i++) {
                    $select->addItem($brand, 'result-' . $brand . '-' . $callType);
                }
                header('Content-type: application/json');
                echo $select->toJSON();
            } elseif (strpos($key, 'result-') === 0) {
                list($null, $brand, $callType) = explode('-', $key);
                 $res = mysql_query('SELECT * FROM ' . DB_TABLE2
                   . ' WHERE PartTypeDescription = \'' . mysql_real_escape_string($callType) . '\'
                 AND Invm_InventoryNumber = \'' . mysql_real_escape_string($brand) . "'");

                $markup = '';
                for ($i = 0; $row = mysql_fetch_assoc($res); $i++) {
                    //$row = array_map('htmlspecialchars', $row);    it looks like the items is already encoded
                    $markup .= <<<HTML
4

1 に答える 1

1

一重引用符で囲まれた文字をエスケープすることはできません。例えば:

$x = 'I don\'t like tomatoes';

それはあなたが思うように引用を逃れることはなく、問題を引き起こすでしょう。この行のコードでは、次のようになります。

$res = mysql_query('SELECT * FROM ' . DB_TABLE2
   . ' WHERE PartTypeDescription = \'' . mysql_real_escape_string($callType) . '\'
   AND Invm_InventoryNumber = \'' . mysql_real_escape_string($brand) . "'");

二重引用符を使用したエスケープシーケンスで文字列をラップする必要があります。

$res = mysql_query('SELECT * FROM ' . DB_TABLE2
   . " WHERE PartTypeDescription = \'" . mysql_real_escape_string($callType) . "\'
   AND Invm_InventoryNumber = \'" . mysql_real_escape_string($brand) . "'");
于 2012-07-11T13:35:59.943 に答える