为什么这个SQL语句
$array = $wpdb->get_results('SELECT * FROM wp_before_after WHERE patient = '.$patientName );
生成此错误?
WordPress数据库错误:[未知列' sarah'在' where子句'] SELECT * FROM wp_before_after WHERE patient = sarah-jordon
它就像是在交换病人'和#sarah-jordon'和思考sarah-jordon是数据库中的一列。
答案 0 :(得分:1)
你的价值附近缺少引号。
$array = $wpdb->get_results('SELECT * FROM wp_before_after WHERE patient = "'.$patientName . '"');
但如果使用参数化查询,它会更强大。
我在wordpress参考中快速检查了,他们有准备方法
答案 1 :(得分:0)
虽然A.D。的答案是正确的......
$array = $wpdb->get_results('SELECT * FROM wp_before_after WHERE patient = "'.$patientName . '"');
...并且提到OP示例不是非常健壮/安全(易受SQL注入攻击)我认为使用{{1发布是安全的示例是值得的声明:
prepare
Documentation can be found here
使用// Usage: $wpdb->prepare( 'query' [, value_parameter, value_parameter ... ] );
// Example:
$patient_name = .$patientName;
$patient = $wpdb->get_var(
$wpdb->prepare( "SELECT * FROM wp_before_after WHERE patient = %d", $patient_name ));
的原因是它可以防止对带参数的查询进行SQL注入攻击。例如,在OP示例中,如果有人要输入..
prepare
或者可能不那么阴险:
sarah; DROP TABLE wp_before_after
..进入sarah OR 1=1
字段,SQL将被执行并可能丢弃您的Patient Name
表或返回所有记录在wp_before_after
表中
patient
方法SQL在执行查询之前转义值 - 这会阻止您的变量/参数可能被读作SQL。它基本上是说"嘿,请确保您将这些视为值,而不是查询的一部分。"
作为一般经验法则,您希望在查询将用户输入作为参数的所有情况下使用prepare
。您不希望在不需要用户输入的情况下使用prepare
- 例如,让所有患者姓名以' s开头。