-3

次のPHPコードがあります。

function get_all_labels_by_language_id($language_code, $page_index, $user_id) {
    $language_id = $this->get_language_id($language_code);
    $users_query = "select  eng.label_value, loc.votes, loc.user_id, loc.approved, eng.language_value,       
            coalesce(loc.language_value)
            from    labels eng
            left outer join    
                labels loc
            on      loc.language = " . $language_id . "
            and eng.label_value = loc.label_value
            and loc.user_id = '" . $user_id . "'
            where   eng.language = 45
            order by loc.language_value";
    $data = $this->db->query($users_query)->result_array();
    $result = array();
    for ($i = 0; $i < count($data); $i++) {
        $result[$i]['language_id'] = $language_id;
        if (!$data[$i]['user_id']) {
            $result[$i]['translate'] = $data[$i];
            $result[$i]['alternatives'] = NULL;

            $other_records_query = "select  eng.label_value, loc.votes, loc.user_id, loc.approved, eng.language_value,       
                coalesce(loc.language_value)
                from    labels eng
            left outer join    
                labels loc
            on      loc.language = " . $language_id . "
            and eng.label_value = loc.label_value
            where   eng.language = 45 and loc.label_value='" . $data[$i]['label_value'] . "'
            order by loc.language_value";
            $other_records = $this->db->query($other_records_query)->result_array();
            for ($k = 0; $k < count($other_records); $k++) {
                if ($other_records[$k]['approved'] == '1') {
                    $result[$i]['translate'] = $other_records[$k];
                } else {
                    $result[$i]['alternatives'][] = $other_records[$k];
                }
            }
        } else {
            $result[$i]['translate'] = $data[$i];
            $result[$i]['alternatives'] = NULL;
            if ($data[$i]['approved'] == '1') {
                $other_records_query = "select  eng.label_value, loc.votes, loc.user_id, loc.approved, eng.language_value,       
                coalesce(loc.language_value)
                from    labels eng
            left outer join    
                labels loc
            on      loc.language = " . $language_id . "
                    and eng.label_value = loc.label_value
                    and loc.approved='1'
            where   eng.language = 45 and loc.label_value='" . $data[$i]['label_value'] . "'
            and approved='0' order by loc.language_value";
                $other_records = $this->db->query($other_records_query)->result_array();
                for ($k = 0; $k < count($other_records); $k++) {
                    $result[$i]['alternatives'][] = $other_records[$k];
                }
            } else {
                $other_records_query = "select  eng.label_value, loc.votes, loc.user_id, loc.approved, eng.language_value,       
                coalesce(loc.language_value)
                from    labels eng
            left outer join    
                labels loc
            on      loc.language = " . $language_id . "
                    and eng.label_value = loc.label_value
                    and loc.approved='1'
            where   eng.language = 45 and loc.label_value='" . $data[$i]['label_value'] . "'
            order by loc.language_value";
                $other_records = $this->db->query($other_records_query)->result_array();
                for ($k = 0; $k < count($other_records); $k++) {
                    $result[$i]['alternatives'][] = $other_records[$k];
                }
            }
        }
    }

このコードは正しく機能しますが、次のエラーが発生しました。

エラー番号: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 't set up correctly. If you're the store owner, please refer to' ' at line 8

select eng.label_value, loc.votes, loc.user_id, loc.approved, eng.language_value, coalesce(loc.language_value) from labels eng left outer join labels loc on loc.language = 24 and eng.label_value = loc.label_value where eng.language = 45 and loc.label_value='It looks like the payment gateway isn't set up correctly. If you're the store owner, please refer to' order by loc.language_value

Filename: Z:\home\localhost\www\system\database\DB_driver.php

Line Number: 330

教えてください、どうすれば修正できますか?どこが間違っているのかわかりません。前もって感謝します。

4

3 に答える 3

1

column に渡す文字列をエスケープしませんでしたlabel_value。クエリを中断する文字が含まれています。

アップデート

これは CodeIgniter のように見えるので、次を使用する必要があります。

$this->db->escape();

マニュアルはこちら

http://codeigniter.com/user_guide/database/queries.html

于 2012-07-18T12:27:01.670 に答える
0

エスケープされていない文字列を使用して SQL を構築しています。文字列の 1 つに引用符が含まれているとすぐに、あなたは死んでしまいます。つまり、これがユーザー指定の値である場合、データベースの制御を失っただけです (「SQL インジェクション」の Google)。

OK であることがわかっていないすべての文字列をエスケープする必要があります。どの方法を使用するかは、使用する DB フレームワークの問題です。エスケープ機能が提供されます。

于 2012-07-18T12:36:21.367 に答える
0

'文字列リテラルでエスケープする必要があります

'It looks like the payment gateway isn\'t set up correctly. If you\'re the store owner, please refer to' 

mysql_real_escape_stringはあなたの友達です。

于 2012-07-18T12:26:58.303 に答える