【问题标题】:Remote connection to MySQL works via command line, but fails when using php's mysql_connect from a web browser远程连接到 MySQL 可以通过命令行工作,但在从 Web 浏览器使用 php 的 mysql_connect 时失败
【发布时间】:2012-06-24 23:32:35
【问题描述】:

我正在尝试使用 PHP 的 'mysql_connect()' 函数连接到 MySQL 服务器,但连接失败。这是我的代码:

$con = mysql_connect("example.net", "myusername","") or die("Could not connect: ".mysql_error()); 

我将此代码放在 PHP 脚本中,我尝试使用 Web 浏览器打开该脚本(该脚本存储在启用了 PHP 的远程主机上)但它不起作用。它也不会返回 die 错误。在浏览器中成功输出$con 之前回显某些内容,而在该行之后没有任何输出。如果我输入:

mysql -h example.net -u myusername

从远程机器上,我可以毫无问题地连接到数据库并进行查询和其他修改。

更新: 经过一些建议,我也尝试了这个,但没有改善:

<?php
    $usern = "myusername";
    $dbh = new PDO('mysql:host=servername.net;dbname=test', $usern, "");
    echo $usern;
?>

【问题讨论】:

    标签: php mysql mysql-connect


    【解决方案1】:

    php 文件是否与 mysql 数据库位于同一服务器上,如果是,您可能必须使用 'localhost' 作为 mysql_connect() 的第一个参数,而不是外部地址。

    【讨论】:

    • 您好,php 文件位于另一台服务器(网络托管服务器)中,因此 localhost 不起作用。我意识到 web-host 没有 php-mysql 连接,即如果我通过 'web-host' 上的命令行执行 php 文件,它会失败并出现以下错误: PHP Fatal error: Call to undefined function mysql_connect ()。会是这个原因吗?
    • 是的,这就是原因!很可能您的托管计划不支持 php mysql 模块...尝试放置一个 phpinfo();在那里看看是否加载了mysqli或mysql。
    • 无论您是否可以让mysql_connect 工作,您都不应该使用它。请阅读我发布的整个段落以了解确切原因。即使您可能“只是想让某些东西正常工作”,这也不是使用已弃用、不安全的一组函数(如 mysql_* 函数)的可接受理由。
    【解决方案2】:

    运行 PHP 的远程主机使用什么操作系统?可能php.ini 中没有启用 MySQL。另外,请不要将mysql_* 函数用于新代码。它们不再维护,社区已经开始deprecation process(参见red box)。相反,您应该了解prepared statements 并使用PDOMySQLi。如果你不能决定哪一个,this article 会帮助你。如果你想学习,this is a good PDO tutorial

    您是否尝试过使用 PDO 或 MySQLi 接口?如果您正在尝试学习 PHP,无论如何都不应使用 mysql_* 函数。看看你是否可以使用类似这样的行来访问数据库:

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

    如果您需要更详细的文档,此代码直接来自documentation itself

    编辑:另外,尝试使用 PDO 的错误检查功能。此示例使用 PDO 创建数据库连接并尝试执行简单查询。它不使用准备好的语句或任何这些功能,因此它不是生产就绪代码(即*不要在不了解如何改进的情况下将其放入代码中),您需要对其进行编辑以包含SELECT 与您的数据库相关的查询,但它至少应该告诉 PDO 提供有关它遇到的错误的更多信息。

    <?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    $dbhost     = "localhost";
    $dbname     = "test";
    $dbuser     = "root";
    $dbpass     = "admin";
    
    // database connection
    $conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
    
    // query
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "SELECT * FROM booksa";
    $q = $conn->query($sql) or die("ERROR: " . implode(":", $conn->errorInfo()));
    
    $r = $q->fetch(PDO::FETCH_ASSOC);
    
    print_r($r);
    ?>
    

    【讨论】:

    • 感谢您的提示。我切换到您提到的新代码,但这并不能解决我遇到的问题。我尝试了这个简单的文件: 它不会在浏览器中打印出 $usern。
    • @iamauser 是否显示错误消息?您可以发布您使用的 PDO 代码(您可以通过编辑您的问题来发布它)?
    • 我是 StackOverflow 的新手提问。您能否让我知道编写代码的正确格式:这是我使用的代码。
    • @iamauser 编辑您的问题并将该代码放入其中,因为在 cmets 中很难阅读。据我所知,您没有定义server(也不是字符串中的变量名,因为那将是$server)。如果您直接点击问题下方的“编辑”并将代码复制到问题的新部分,会更容易。
    • 我现在做到了。请检查。当我在这里发布它时,我用一些虚拟名称替换了服务器名称。关于您是否返回任何错误的问题,不,它不会返回任何错误,只是一个空白的白屏。
    猜你喜欢
    • 2017-12-09
    • 2017-08-05
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2012-07-20
    相关资源
    最近更新 更多