簡體   English   中英

使用PHP轉義包含變量的MySQL查詢

[英]Escaping a MySQL query containing variables with PHP

我正在WordPress網站上運行以下代碼來查詢數據庫:

$entries = $wpdb->get_results( "SELECT `id`, `lead_id`, `form_id`, `field_number`, `value` FROM `wp_rg_lead_detail` WHERE `value` = \"John\" OR `value` = \"Smith\" OR `value` = \"22101\" ORDER BY `lead_id`" );

我想用預定義的變量替換硬編碼的值。 我嘗試使用以下代碼進行操作:

$entries = $wpdb->get_results( "SELECT `id`, `lead_id`, `form_id`, `field_number`, `value` FROM `wp_rg_lead_detail` WHERE `value` = " . $data['voterdata_FirstName'] . " OR `value` =  " . $data['voterdata_LastName'] . " OR `value` = " . $data['voterdata_VoterZip'] . " ORDER BY `lead_id`" );

不幸的是,第二個代碼塊不起作用。 我注意到ORORDER BY條件未正確解釋,但我不知道如何解決該問題。 我的連接看起來不錯,所以我假設問題出在轉義序列上。 誰能提供解決方案?

老實說,我不確定這是什么問題。 “轉義數據以進行查詢”或“使其正常工作”(從帶有引號的角度來看),或兩者兼而有之。

通過這種方式,您需要知道$ wpdb-> get_results()將使用$ wpdb-> query()方法( 在此處檢查類的定義)

考慮到這一點,如果您檢查有關此主題的wordpress文檔,則需要確定使用$ wpdb-> prepare()(規則是:在實現之前檢查文檔 )。

這將為我們提供以下信息:

$wpdb->get_results(
    $wpdb->prepare(
       "SELECT `id`, `lead_id`, `form_id`, `field_number`, `value` FROM  `wp_rg_lead_detail` WHERE `value` = %s OR `value` = %s OR `value` = %s ORDER BY `lead_id`", 
        $name1, 
        $name2, 
        $name3 
    )
);

假設上面已經正確定義了名稱。

您仍然需要引用參數,因為當mySQL看到它們時,它們實際上就是常量。

嘗試這個:

$entries = $wpdb->get_results( "SELECT `id`, `lead_id`, `form_id`, `field_number`, `value` FROM `wp_rg_lead_detail` WHERE `value` = \"" . $data['voterdata_FirstName'] . "\" OR `value` =  \"" . $data['voterdata_LastName'] . "\" OR `value` = \"" . $data['voterdata_VoterZip'] . "\" ORDER BY `lead_id`" );

更好的是,您可以使用單個IN子句替換OR:

$entries = $wpdb->get_results( "SELECT `id`, `lead_id`, `form_id`, `field_number`, `value` FROM `wp_rg_lead_detail` WHERE `value` = IN(\"" . $data['voterdata_FirstName'] . "\",  \"" . $data['voterdata_LastName'] . "\", \"" . $data['voterdata_VoterZip'] . "\") ORDER BY `lead_id`" );

您的查詢不相等-您忘記了引用(和轉義)變量:

[...snip...] OR `value` =  " . $data['voterdata_LastName'] . " [...snip...]
                           ^---------------------------------^--- PHP string delimiters, not sql

所以你正在產生

OR `value` = foo

代替

OR `value` = 'foo'

謝謝你們的回應。 解決方法如下:

            $entries = $wpdb->get_results( $wpdb->prepare(
            "SELECT `id`, `lead_id`, `form_id`, `field_number`, `value` FROM `wp_rg_lead_detail` WHERE ( `value` = %s OR `value` = %s  OR `value` = %s ) ORDER BY `lead_id`",
            array( $data['voterdata_FirstName'], $data['voterdata_LastName'], $data['voterdata_ZipCode'] )
            )
         );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM