大家好,我运行一个基于wordpress的网站,我想存储用户调用的搜索查询,将其用作分析数据,以了解搜索最多的内容等。。。所以我有一个自定义表,其中的行是
query => the searched query
counter => how many times this query has been searched for
所以一切正常,我遇到的唯一问题是撇号。
我需要在数据库中检查查询是否已经存在,因为如果它已经存在,我只需更新计数器,否则我将插入新行。
我使用默认值get_query_var(\'s\')
我相信wordpress会自动转义。
我用来检查搜索的查询是否已存储在数据库中的简单SQL查询如下:
$search_query = get_query_var(\'s\');
$wpdb->get_row("SELECT * FROM $table WHERE query = \'$search_query\'");
if( $wpdb->num_rows == 0 ) { // insert... }
else { // update... }
我有理由认为这个变量很好,因为它正确地存储在数据库中,没有任何额外的斜杠。只是我运行的SQL查询不起作用,它不返回任何结果,因此它不断插入具有相同
query
价值
我愿意接受任何解决方案,即使使用LIKE
但我相信我遗漏了一些东西,解决方案比我想象的要简单,我宁愿继续使用=
运算符,因为我需要匹配精确的查询。提前非常感谢大家。
P、 它可以很好地处理没有引号的查询,插入新查询并更新现有查询。
最合适的回答,由SO网友:TheDeadMedic 整理而成
哇,那里。你刚刚打开了一罐SQL injection.
我使用默认的get\\u query\\u var(\'s\'),我认为它是由wordpress自动转义的。
不完全是-get_search_query()
会的,但是get_query_var( \'s\' )
获取“原始”值。
无论如何,始终使用wpdb::prepare
或执行SQL之前的类似转义:
$query = $wpdb->prepare( "SELECT * FROM $table WHERE query = %s", $search_query );
$item = $wpdb->get_row( $query );
if ( $item === null ) {
$wpdb->insert( $table, [ \'query\' => $search_query ] );
}
查看awesome helper方法
wpdb::insert
也