PDO wordpress 查询

Posted

技术标签:

【中文标题】PDO wordpress 查询【英文标题】:PDO wordpress query 【发布时间】:2015-12-09 23:27:04 【问题描述】:

我一直在努力

错误:SQLSTATE[42000]:语法错误或访问冲突:1064 你 您的 SQL 语法有错误;检查对应的手册 您的 mysql 服务器版本,以便在附近使用正确的语法

请帮忙! =] 我已经检查了 phpmyadmin 中的这个文字查询是否有效。

SELECT * 
FROM  `wp_customgravityall` 
WHERE  (`time` >= '2015-09-01 00:00:00' AND `time` <= '2015-09-13 23:59:59')
ORDER BY  `wp_customgravityall`.`time` DESC

但是我下面的代码不起作用。

<?php
$servername = "http://www.myhomepagenamethingy.com/";
$username = DB_USER;
$password = DB_PASSWORD;
$dbname = DB_NAME;

$table_name = 'wp_' . 'customgravityall';

$from_date  = isset( $_GET['from_date'] )   ? $_GET['from_date'] . " " . "00:00:00" : '';
$to_date    = isset( $_GET['to_date'] )     ? $_GET['from_date'] . " " . "23:59:59" : '';


try 
    $conn = new PDO('mysql:$servername;dbname=$dbname', $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $statement = $conn->prepare(
        "SELECT * 
        FROM ? 
        WHERE `time` >= ? AND `time` <= ?
        ORDER BY `wp_customgravityall`.`time` DESC"
    );
    $statement->bindValue(1, $conn->quote($table_name), PDO::PARAM_STR);
    $statement->bindValue(2, $conn->quote($from_date), PDO::PARAM_STR);
    $statement->bindValue(3, $conn->quote($to_date), PDO::PARAM_STR);
    var_dump($statement);
    $statement->execute();
 catch(PDOException $e) 
    echo 'PDO ERROR: ' . $e->getMessage();

?>

【问题讨论】:

【参考方案1】:

您正在尝试使用FROM ? 绑定表

准备好的语句中的规则是您不能绑定表/列。

您可以选择表名,将变量分配给表名,或者使用安全列表。

将表名设置为变量的示例:

$table = "table_name";

然后

SELECT FROM $table

或在表名周围加上勾号,如果您的表包含 MySQL 会抱怨的字符,例如空格或连字符:

SELECT FROM `$table`

在您的情况下,要使用的变量是$table_name

然后您需要相应地重新调整绑定。

我发现的另一件事是您在这里使用了单引号:

$conn = new PDO('mysql:$servername;dbname=$dbname', $username, $password);

变量不被单引号解析(除非连接),使用双引号:

$conn = new PDO("mysql:$servername;dbname=$dbname", $username, $password);

但是,您的构造似乎不正确,因此您“可能”必须对其进行调整。

http://php.net/manual/en/pdo.connections.php

手册中的示例:

$dbh = new PDO("mysql:host=localhost;dbname=test", $user, $pass);

但是,我可能对此有误,因为我确实相信有几种方法可以构建与 PDO 的连接。

因此将其更改为:

$dbh = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

另外,确保constants 已正确分配。

这些被视为常量而不是字符串:

$username = DB_USER;
$password = DB_PASSWORD;
$dbname = DB_NAME;

如果这些不是预定义的常量,则需要将它们括在引号中:

$username = "DB_USER";
$password = "DB_PASSWORD";
$dbname = "DB_NAME";

然后这个:

$servername = "http://www.myhomepagenamethingy.com/";

这很可能是 localhost 设置在引号中,或者是 IP 地址,具体取决于您的系统设置方式,并且是通常的设置,而不是 URL。如果我在回答中已经给你的内容对你不适用,你需要找出你的主机设置是什么。

【讨论】:

也感谢您发现报价。这绝对解决了语法错误。尽管我已经确认了我的数据库名称,但我收到了一个没有选择数据库的错误。是因为数据库主机名不正确吗? @ahnbizcad 不客气。发现您的连接方法后,我对答案进行了一些编辑。重新加载它以在显示 “但是,您的构造似乎关闭,因此您“可能”必须对其进行调整.....” - 它是缺少的“host=”。另请参阅有关它的手册。还要检查你的常量。 啊,即使在阅读之后,host= 部分也完全绕过了我的视觉和心理雷达。始终是您认为不是问题的事情:p 现在我只需要授予我指定的用户名的权限。 =] 我真的不赞成。哎呀,一些可怜的混蛋只是喜欢过着悲惨的生活。而且那个可怜的混蛋的名字毫无意义。 @Fred-ii- 我得到了你的支持,你得到了有史以来最详细的答案!【参考方案2】:

找到我的解决方案:

找到的解决方案是更改连接cms与数据库的文件中的用户名和密码,我突然看到它可能是带有点的用户名或同一个域名。

直至得出结论的流程步骤

在 Wordpress 中,我遇到了 mysqli 和 PDO 之间的问题。 我用命令 yum update & yum upgrade, no centos 解决了它,他给了我以下更新:

================================================== 
   ==============================
 Package Arch Version Repository Size
 ==================================================                             
==============================     
Installing:
 lsphp73-mysqlnd x86_64 7.3.15-1.el7 litespeed 132k

     替换 lsphp73-mysqlnd.x86_64 7.3.14-1.el7 更新: lsphp73 x86_64 7.3.15-1.el7 litespeed 5.0 M lsphp73-bcmath x86_64 7.3.15-1.el7 litespeed 27 k lsphp73-common x86_64 7.3.15-1.el7 litespeed 650 k lsphp73-gd x86_64 7.3.15-1.el7 litespeed 114 k lsphp73-imap x86_64 7.3.15-1.el7 litespeed 32k lsphp73-mbstring x86_64 7.3.15-1.el7 litespeed 559 k lsphp73-opcache x86_64 7.3.15-1.el7 litespeed 191 k lsphp73-pdo x86_64 7.3.15-1.el7 litespeed 67 k lsphp73-process x86_64 7.3.15-1.el7 litespeed 29 k lsphp73-soap x86_64 7.3.15-1.el7 litespeed 120 k lsphp73-xml x86_64 7.3.15-1.el7 litespeed 126 k openlitespeed x86_64 1.6.9-1.el7 litespeed 37 M

交易摘要 ==================================================== =============================== 安装 1 个软件包 升级12个包

总下载大小:44 M 下载包: 没有可用于 litespeed 的 Presto 元数据


总计 13 MB/秒 | 44 MB 00:03

除了我的 fastcgi_pass unix: /var/php-nginx/15822663384347.sock/socket;

这引起了冲突。

但还是没有解决问题。

【讨论】:

以上是关于PDO wordpress 查询的主要内容,如果未能解决你的问题,请参考以下文章

优化 WordPress 插件“更好的 WordPress 最近评论”中的慢查询

在 Wordpress 博客之外查询 Wordpress 数据库以返回最新的博客链接,摘录

使用来自 Gatsby 的元查询查询 wordpress

PHP 使用wordpress数据库类的Wordpress数据库查询

如何使用 WordPress 进行自定义查询?

WordPress 盖茨比