我用于获取用户名的定制SQL查询会给我一个警告和错误

时间:2018-01-21 作者:Coder321

我正在编写一个自定义查询,以创建指向特定用户名的链接。用户将登录,然后可以单击指向该用户名的链接。我在php中运行查询时收到警告和错误。

警告是:

在/home/中调用的wpdb::prepare()缺少参数2/public\\u html/wp-content/plugins/insert-php-code-snippet/shortcode-handler。php(72):eval()\'d代码位于第22行并已定义

错误是:

您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解在第1行中使用“a.id=b.customer\\u id join as c on b.appointment\\u id=c.id”的正确语法

我的查询:

global $wpdb;
  //the query

    $currentuserid = wp_get_current_user();
        $havelesson = $wpdb->query( 
            $wpdb->prepare( 
                "
SELECT e.user_login FROM $wpdb->ab_customers  as a
join $wpdb->ab_customer_appointments as b on a.id = b.customer_id
join $wpdb->ab_appointments as c on b.appointment_id = c.id
join $wpdb->ab_staff as d on b.appointment_id = c.id
join $wpdb->users as e on d.wp_user_id = e.id
where a.wp_user_id = $currentuserid->ID
and start_date > now()
order by start_date asc
Limit 1
"   
)
 );
什么可能导致错误和警告?

1 个回复
SO网友:Tom J Nowell

警告缺少wpdb::prepare()的参数2,在/home/中调用/public\\u html/wp-content/plugins/insert-php-code-snippet/shortcode-handler。php(72):eval()\'d代码位于第22行并已定义

看来人们对prepare 方法应该执行。您为函数提供了一个参数,但它需要多个参数。因此missing argument 2 警告

什么是prepare 那你呢

想象以下查询搜索具有特定标题的帖子:

$wpdb->query( "SELECT * FROM $wpdb->posts WHERE post_title=$title" );
此代码有严重错误。这是非常不安全的。要说明原因,请考虑用户搜索此项:

$title = \'*;SELECT user_password FROM wp_users WHERE username = "admin"\';
$wpdb->query( "SELECT * FROM $wpdb->posts WHERE post_title=$title" );
现在我们有一个SQL注入攻击。prepare 旨在允许我们插入变量,同时确保查询不受这些类型值的影响。

例如:

$query = $wpdb->prepare(
    "SELECT * FROM $wpdb->posts WHERE post_title=%s",
    array( $title )
);
$wpdb->query( $query );
现在我们的查询是安全的。您的查询也存在此问题,因为wpdb prepare的使用不正确。因此,以下变量极易受到SQL攻击:

  • $wpdb->ab_customers
  • $wpdb->ab_customer_appointments
  • $wpdb->ab_appointments
  • $wpdb->ab_staff
  • $wpdb->users
  • $currentuserid->ID$wpdb->prepare 这就是为什么你需要更多的论据。

    错误现在我们知道了如何保护查询,这仍然留下了另一个问题:

    The query isn\'t valid SQL

    您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解在第1行中使用“a.id=b.customer\\u id join as c on b.appointment\\u id=c.id”的正确语法

    就是这个as a join 语法有问题,这不是我遇到的问题,似乎是编造出来的。

    这是连接的外观:

    SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
    FROM Orders
    INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
    
    有关更多信息,请参阅W3 School,请记住,这不是一个通用的SQL堆栈交换,这里最好不要问像这样的纯SQL问题

    关于SQL和WPDB的一个注意事项,我有一种压倒性的感觉,这里的原罪是所有这些都可以通过日期归档、作者归档、自定义帖子类型和自定义分类法来完成。

    E、 g.如果您为客户约会使用了自定义的帖子类型,并将这些帖子的作者设置为约会所属的用户,那么您将免费获得作者档案,为您提供:

    自定义archive-customer_appointment.php 模板存档于example.com/customer_appointment/, URL可通过配置register_post_typeget_author_linkpre_get_posts 要过滤所有内容,以便用户只看到自己的内容,您可以使用WP_Query 以及整个WP_Cache 工具链会自动加速一切,缓存插件和对象插件会突然工作,为您的javascript提供免费的REST API端点,一个用于编辑和管理所有这些数据的免费管理UI

结束