为什么这个SQL语句被错误地读取?

时间:2015-02-24 16:37:41

标签: mysql wordpress

为什么这个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是数据库中的一列。

2 个答案:

答案 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开头。