[英]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`" );
不幸的是,第二個代碼塊不起作用。 我注意到OR
和ORDER 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.