2010-02-07 118 views
3

我想我的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'(10061)

下面是我的故障排除步骤:

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

如何让此代码安全地工作?我如何查看关于我的MySQL的基本有用信息,如用户名?

+1

我建议你移动到mysqli,如果可以的话。它是mysql扩展的更新和更好的版本。 – waiwai933 2010-02-08 03:38:57

+0

感谢您的回复waiwai!由于我是PHP,PDO和mysqli的新手,我对你的建议(mysqli)做了一些研究,发现连接到MySQL有三个主要的API选项:PHP的MySQL扩展,PHP的mysqli和PHP数据对象(PDO - 目前现在学习)。 PHP的MySQL扩展只能用于4.1.3以前的MySQL版本。 (我想这就是我使用的),强烈建议使用mysqli(与MySQL扩展相比,它有很多优点),PDO允许您在对PHP代码进行微小更改的情况下切换数据库类型。这一切都有道理! – Anthony 2010-02-08 19:28:05

回答

5

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

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

编辑:

这不回答你的主要问题,但在评论发布此信息将是一个烂摊子。

比W3Schools的相反,检查出建议的资源:

+0

感谢您的回复和推荐tcpview(Netstat是我的 列表中的东西学习)。我跑了它,并没有看到当地的 地址3306。也感谢您推荐PDO - 我是新手,并且遵循w3schools示例。我会做一些研究。 现在我该如何使MySQL通过3306网络连接到代码? – Anthony 2010-02-08 00:58:26

+0

绝对正确的PDO;令我惊讶的是,我看到有多少人仍然开始使用mysql_ *命令。那里有很多可怕的,过时的教程! PDO要好得多,而且从一开始就不难。 – JAL 2010-02-08 01:36:07

+0

@ 01010011:不要打扰有MySQL支持TCP;它不太安全,不应该在开发服务器上完成。使用'localhost'作为主机名并完成它。至于设置的位置,请参阅我对Mr-sk的回答的第一条评论。 – outis 2010-02-08 01:36:07

1

也许你没有在MySQL安装上设置远程连接。您正尝试通过端口进行连接,这与远程连接相同。它已经有一段时间,因为我已经做了MySQL,但是这是一个大破绽:

检查是否MySQL的是通过在Windows命令输入 提示在主机上运行 :“远程登录192.0.0.1 3306”和 得到的消息“无法打开 连接到主机,端口3306: 连接失败”

它行不通。你确定它配置为3306端口而不是另一个端口吗?仔细检查一下。

代码本身看起来不错,而不是问题。港口显然是问题。

+0

感谢您的回复Mr-sk。如何检查安装后是否为端口3306配置了MySQL?我用什么命令来获取这些信息?我安装MySQL时可能已禁用它。 – Anthony 2010-02-08 00:03:10

+0

使用IP 127.0.0.1怎么样? – 2010-02-08 00:05:29

+0

感谢您的回复乔尔。你什么意思?如何检查服务器名称和用户名以确保我输入了正确的名称? usernamemysql_connect(服务器,用户名,密码); – Anthony 2010-02-08 00:27:07

1

注:这是解决不了问题的任择议定书的问题,但我会继续我的回答对历史的原因,也因为它可能是一些其他人的问题。

你在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

+0

感谢您的回复Andrew和非常有用的源代码链接。 即时通讯使用XP和XAMPP。 XAMPP阅读我的文档,其中包括:“PHP 5.3.0”,“Apache 2.2.12(启用IPV6)” 我检查了主机文件,“127.0.0.1本地主机”是唯一的入口。您提供的链接指出应删除“#:: 1本地主机”这一行,但我没有该行。我也没有在这个文件中看到有关IPv4或IPv6的任何信息。那么我现在该做什么? – Anthony 2010-02-08 01:19:25

+0

@ 01010011:在这种情况下,这不是你的问题。检查上面的答案以确保MySQL正在3306上进行侦听。 – 2010-02-08 03:34:15

+0

Marc B提供了一个很好的方法来找出这个问题。我可以更改MySQL命令行中的端口和skip_networking值吗? – Anthony 2010-02-08 18:14:57

1

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

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

是的,谢谢你。我仍然不知道为什么我的密码在登录到MySQL命令行客户端的一天无法工作,这非常令人沮丧!突然它在第二天开始工作,这是第二次发生这种情况。所以我改变了根希望,这就停止了这个问题 – Anthony 2010-02-08 01:30:23

+0

我的密码再次停止工作。但是,我启动了服务器实例配置向导并对其进行了更改,并且工作正常,我又回来了。 – Anthony 2010-02-09 15:47:45

1

如果你可以访问MySQL外壳中,你可以检查服务器的网络配置是这样的:

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'配置变量中指定的端口。

+0

不错,马克,谢谢您的回复!我的端口值是0,我的skip_networking值是'ON'。如何从MySQL命令行更改这些值? – Anthony 2010-02-08 17:26:26

+0

我不知道他们是否可以从MySQL内更改。我的理解是,如果mysql启动skip_networking = on,它不会加载网络代码,并且不能强制在之后加载它。 您很可能必须修改服务器的my.ini(或my.cnf,或者您在特定安装中调用的任何内容)。在[mysqld]部分设置skip-networking,在[client]和[mysqld]部分都设置端口号。 – 2010-02-08 22:50:35

+0

我第三次遇到密码问题,这次我启动了服务器实例配置向导,并将其更改并运行。无论如何,在进行配置步骤时,我注意到网络默认开启,但端口3306的防火墙例外未被检查。所以我检查了它,当配置完成后,我尝试了下面的命令:show variables like'port';并显示像'skip_networking'这样的变量;这次结果是3306和关闭。 – Anthony 2010-02-09 15:52:04

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(); 
} 
?> 

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

阵列([exo_flowers_ID ] => 1 [0] => 1 [名称] => Dendroseris Neriifolia [1] => Dendroseris Neriifolia [国家] =>智利[2] =>智利[env_workers_id] => 1 [3] => 1) ([exo_flowers_ID] => 2 [0] => 2 [name] => Snowdonia Hawkweed [1] => Snowdonia Hawkweed [country] =>北威尔士[2] =>北威尔士[env_workers_id] => 1 [3] => 1)

所有我想要的是,显示的行或列的内容,而是我把所有的内容加上所有这些括号。如何仅显示表格行或列的内容?最后,我该如何查询如下:SELECT * FROM tableName WHERE'columnName1'='somename'AND'columnName2'='someothername'; ?

+0

我解决了上述问题。感谢所有帮助的人 – Anthony 2010-02-13 11:46:01

0

我解决了同样的问题“无法连接到'localhost'上的MySQL服务器”(Windows 7,XAMPP v.3.2.1安装,php连接到MySQL不起作用):

  1. 打开XAMPP控制面板(我的版本是v.3.2.1)。按面板右侧的“Shell”按钮。

  2. 窗口用一个标题打开: “管理员:XAMP的Windows - MySQL的-u根”,并与以下文本:

Setting environment for using XAMPP for Windows 
[email protected] c:\xampp 
  • 输入:#mysql
  • 获得答案: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 [email protected] identified by ‘password’;

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

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

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