PHP MySQL连接失败

时间:2010-02-07 23:54:08

标签: php mysql

我正在尝试使用以下代码将我的PHP代码安全地连接到MySQL:

<html>
    <?php
        $con = mysql_connect("localhost:3306","root","password");
        if(!$con)
        {
            die('Could not connect: ' . mysql_error());
        }
        else
        {
            echo "Connection established!";
        }
        mysql_close($con);
    ?>
</html>

但我不断收到以下错误消息:

  

警告:mysql_connect()[function.mysql-connect]:无法连接到第5行的C:\ xampp \ htdocs \ database_connect.php中'localhost'(10061)上的MySQL服务器   无法连接:无法连接到'localhost'上的MySQL服务器(10061)

以下是我采取的故障排除步骤:

  • 检查mysqld是否在Windows任务管理器进程中运行 - 它是
  • 通过键入Windows命令提示符:“telnet 192.0.0.1 3306”检查MySQL是否在主机上运行,​​并收到消息“无法打开与主机的连接,在端口3306上:连接失败”
  • 检查Windows防火墙是否阻止了MySQL - MySQL是一个例外。

如何让这段代码安全地运行?我如何检查关于我的MySQL的基本有用信息,如用户名?

7 个答案:

答案 0 :(得分:7)

您可以使用tcpview检查MySQL服务器是否绑定到端口3306。更简单地说,从主机说明符中删除端口。然后,驱动程序应尝试使用命名管道,而不是TCP套接字。

在一个不相关的说明中,我强烈建议您切换到PDO MySQL驱动程序。你正在使用的是非常过时的。 PDO支持prepared statements的一大优势是提供安全性和效率优势。

编辑:

这不能解答您的主要问题,但在评论中发布此信息将是一团糟。

而不是W3Schools,请查看以下建议的资源:

答案 1 :(得分:1)

也许您没有在MySQL安装上设置远程连接。您正尝试通过端口进行连接,该端口与远程连接相同。我做了MySQL已经有一段时间了,但这是一个死的赠品:

  

检查MySQL是否正在运行   通过键入Windows命令主机   提示:“telnet 192.0.0.1 3306”和   收到消息“无法打开   端口3306上与主机的连接:   连接失败“

它不会起作用。你确定它是为端口3306而不是另一个端口配置的吗?仔细检查一下。

代码本身看起来很好而且不是问题。港口显然是个问题。

答案 2 :(得分:1)

注意:这不是OP问题的解决方案,但我会因历史原因而保留我的答案,也因为这可能是其他人的问题。

您使用的是Windows Vista / 7并运行PHP 5.3.1吗?

最近PHP中MySQL库的更改(现在使用mysqlnd)在连接到localhost时会导致问题。已填写错误,但在此之前,请确保您的hosts文件包含localhost的条目。

您的hosts个文件localhost条目必须如下:

127.0.0.1  localhost
#::1       localhost

如您所见,IPv6条目已注释掉,IPv4条目未注明。

hosts文件位于:

%WINDIR%\System32\drivers\etc\hosts

Source

答案 3 :(得分:1)

您无法恢复密码,但可以创建一个新密码。关闭MySQL服务并执行:

cd c:\mypathtomysql\bin
mysqladmin -u root password NEWPASSWORD

答案 4 :(得分:1)

如果您可以访问MySQL shell,您可以检查服务器的网络配置,如下所示:

mysql> show variable like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  | 
+---------------+-------+
mysql> show variables like 'skip_networking';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| skip_networking | OFF   | 
+-----------------+-------+
1 row in set (0.00 sec)

如果'skip_networking'设置为'ON',那么您的MySQL服务器已配置为不允许通过网络访问,并且只能通过本地套接字运行。否则它将监听'port'配置变量中指定的端口。

答案 5 :(得分:1)

大家好,这是我第一次尝试使用Outis建议的使用PDO连接MySQL和PHP。有效。

<?php 
$user = root;
$pass = password;
try
{
    $dbh = new PDO('mysql:host = localhost; dbname=databaseName', $user,$pass);
    if($dbh)
    {
        print "Connected successfully";
    }
}
catch (PDOException $e)
{
    print "Error: " . $e->getMessage(). "<br/>";
    die();
}
?>

这是我的第二次尝试 - 这次我正在尝试进行查询

<?php 
$user = root;
$pass = password;
try
{
    $dbh = new PDO('mysql:host = localhost; dbname=databaseName', $user,$pass);
    foreach($dbh->query('SELECT * FROM tableName') as $row)
{
    print_r($row);
}
$dbh = null; 
}
catch (PDOException $e)
{
    print "Error: " . $e->getMessage(). "<br/>";
    die();
}
?>

运行此代码后,我得到以下结果:

  

Array([exo_flowers_ID] =&gt; 1 [0] =&gt; 1 [name] =&gt; Dendroseris Neriifolia [1] =&gt; Dendroseris Neriifolia [country] =&gt; Chile [2] =&gt; Chile [ env_workers_id] =&gt; 1 [3] =&gt; 1)数组([exo_flowers_ID] =&gt; 2 [0] =&gt; 2 [name] =&gt; Snowdonia Hawkweed [1] =&gt; Snowdonia Hawkweed [country] = &gt;北威尔士[2] =&gt;北威尔士[env_workers_id] =&gt; 1 [3] =&gt; 1)

我想要的只是显示行或列的内容,而是获得所有内容以及所有这些括号。如何仅显示表格行或列的内容?

最后,我如何进行如下查询:SELECT * FROM tableName WHERE'columnName1'='somename'AND'columnName2'='someothername'; ?

答案 6 :(得分:0)

我解决了同样的问题&#34;无法在&#39; localhost&#39;&#34;上连接到MySQL服务器通过以下步骤(Windows 7,XAMPP v.3.2.1安装,php连接MySQL无法正常工作):

  1. 打开XAMPP控制面板(我的版本是v.3.2.1)。按下按钮&#34; Shell&#34;在小组的右侧。

  2. 窗口打开,标题为: &#34;管理员:XAMP for Windows - mysql -u root&#34;并附有以下文字:

  3. Setting environment for using XAMPP for Windows
    comp@COMP c:\xampp
    
    1. 输入:#mysql
    2. 获得答案:Welcome to the MySQL monitor…

      然后输入:mysql>create database mdb;

      答案:ERROR 1044 (42000): Access denied for user ‘’@’localhost’ to database ‘drawdb’

      输入:#mysql –u root

      答案:Welcome to the MySQL monitor…

      输入:mysql>create database mdb;

      答案:Query OK, 1 row affected (0.00 sec)

      输入:mysql>grant all on mdb.* to user@localhost identified by ‘password’;

      答案:Query OK, 0 rows affected (0.06 sec)

      即。我允许手动创建的数据库访问指定的用户。之后,用户“user”和密码“password”的MySQL连接可以成功创建:

      > $servername = "localhost";  
      > $username = "user";  
      > $password = "password"; 
      > // Create connection 
      > $conn = new mysqli($servername, $username, $password);