2

我正在在线迁移我的本地文件,并且我的 db 脚本存在 PHP 问题。在本地工作正常(运行 PHP 5.3.8)但在我的服务器上出现以下错误(PHP 5.3.10)

没有 $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

致命错误:在第 108 行的 /.../...php 中的非对象上调用成员函数 setFetchMode()

使用 $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

SQLSTATE [42000]:语法错误或访问冲突:1142 SELECT 命令拒绝用户 '...'@'205.186.180.26' 用于表 'invited'

这是我的代码:

class guest {
    public $id;
    public $guest_name;
    public $url_phrase;
}

$guest = new guest;

if (isset($_GET['p'])) {
    $url_phrase = urldecode($_GET['p']); 
} else if (isset($_POST['p'])) {
    $url_phrase = urldecode($_POST['p']); 
}

if (isset($url_phrase)) {

    try {

    $DBH = new PDO("mysql:host=myhost.com;dbname=mydbname", "myusername", "mypassword");
    $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

    $url_phrase = $DBH->quote($url_phrase);
    $sql = "SELECT id, guest_name, url_phrase FROM mydbname.invited WHERE url_phrase = $url_phrase";

    $stmt = $DBH->query($sql);
    $stmt->setFetchMode(PDO::FETCH_INTO, new guest);

    $guestNumber = $stmt->rowCount();

    if($guestNumber > 0) {
        etc...  
    }
    if($guestType == "solo") {
        foreach($stmt as $guest) {
            $name = $guest->guest_name;
            etc...  
        }
    }
} else {
    other stuff.. etc..
    $DBH = null;
} catch (PDOException $e) {
    echo $e->getMessage();
}
}

作为这个用户,我得到了简单的选择语句可以正常工作(我认为它与权限无关),我的问题似乎与我的 PDO 实现有关。我怎样才能摆脱这个错误?我是否以一种搞砸了的奇怪方式准备/执行声明?谢谢你的帮助

4

5 回答 5

7

我有同样的问题。在我将代码从本地上传到生产服务器后,用户拥有所有权限。问题是数据库名称——在我的本地环境中,它类似于 dattabase1,而在生产中,名称不同...prefix_ddatabas1。我将数据库的名称更改为正确的名称,一切正常。

于 2014-12-13T20:01:37.610 回答
2

听起来像是服务器上的访问问题:

SQLSTATE [42000]:语法错误或访问冲突:1142 SELECT 命令拒绝用户 '...'@'205.186.180.26' 用于表 'invited'

您是否从 CLI(或 PHP 之外的其他一些 sql 客户端)进行了测试,以确保您的脚本可以访问?

您可能需要登录数据库以访问您的脚本正在运行的用户,或者检查您在脚本中使用的凭据对于服务器环境中的数据库是否准确。

于 2012-07-09T22:18:46.750 回答
1

我有同样的问题,代码在开发服务器上工作,但在生产服务器上没有,其他使用同一张表的脚本正在工作。我错过了在 dev 和 prod 环境之间更正数据库表前缀。(数据库名称不一样)^^

于 2014-08-05T15:38:11.810 回答
1

我收到了同样的错误。开发数据库名称与生产数据库名称不同,因此导致此错误。我将代码中的数据库名称更改为生产数据库名称,并且它起作用了。

谢谢

于 2016-01-06T20:18:31.963 回答
-2

您有访问冲突:

Syntax error or access violation

您正在使用的用户/主机:

1142 SELECT command denied to user '...'@'205.186.180.26'

无法从“邀请”表中选择

于 2012-07-09T22:20:11.467 回答