mysql_connect

(PHP 4, PHP 5)

mysql_connect打开到 MySQL 服务器的连接

警告

此扩展在 PHP 5.5.0 中被弃用,并在 PHP 7.0.0 中被移除。相反,应使用 MySQLiPDO_MySQL 扩展。另请参阅 MySQL:选择 API 指南。此函数的替代方案包括

描述

mysql_connect(
    字符串 $server = ini_get("mysql.default_host"),
    字符串 $username = ini_get("mysql.default_user"),
    字符串 $password = ini_get("mysql.default_password"),
    布尔值 $new_link = false,
    整数 $client_flags = 0
): 资源|false

打开或重用到 MySQL 服务器的连接。

参数

服务器

MySQL 服务器。它还可以包含端口号。例如“主机名:端口”或本地套接字的路径,例如“:/path/to/socket”用于 localhost。

如果 PHP 指令 mysql.default_host 未定义(默认),则默认值为 'localhost:3306'。在 SQL 安全模式 中,此参数被忽略,始终使用值 'localhost:3306'。

用户名

用户名。默认值由 mysql.default_user 定义。在 SQL 安全模式 中,此参数被忽略,并使用拥有服务器进程的用户的名称。

密码

密码。默认值由 mysql.default_password 定义。在 SQL 安全模式 中,此参数被忽略,并使用空密码。

new_link

如果使用相同的参数对 mysql_connect() 进行第二次调用,则不会建立新连接,而是返回已打开连接的连接标识符。 new_link 参数修改此行为,并使 mysql_connect() 始终打开一个新连接,即使 mysql_connect() 之前使用相同的参数调用过。在 SQL 安全模式 中,此参数被忽略。

client_flags

client_flags 参数可以是以下常量的组合:128(启用 LOAD DATA LOCAL 处理),MYSQL_CLIENT_SSLMYSQL_CLIENT_COMPRESSMYSQL_CLIENT_IGNORE_SPACEMYSQL_CLIENT_INTERACTIVE。阅读有关 MySQL 客户端常量 的部分以获取更多信息。在 SQL 安全模式 中,此参数被忽略。

返回值

如果成功,则返回 MySQL 连接标识符;如果失败,则返回 false

示例

示例 #1 mysql_connect() 示例

<?php
$link
= mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!
$link) {
die(
'无法连接:' . mysql_error());
}
echo
'连接成功';
mysql_close($link);
?>

示例 #2 mysql_connect() 示例,使用 hostname:port 语法

<?php
// 我们连接到 example.com 和端口 3307
$link = mysql_connect('example.com:3307', 'mysql_user', 'mysql_password');
if (!
$link) {
die(
'无法连接:' . mysql_error());
}
echo
'连接成功';
mysql_close($link);

// 我们连接到 localhost 的端口 3307
$link = mysql_connect('127.0.0.1:3307', 'mysql_user', 'mysql_password');
if (!
$link) {
die(
'无法连接:' . mysql_error());
}
echo
'连接成功';
mysql_close($link);
?>

示例 #3 mysql_connect() 示例,使用 ":/path/to/socket" 语法

<?php
// 我们连接到 localhost 和套接字,例如 /tmp/mysql.sock

// 变体 1:省略 localhost
$link = mysql_connect(':/tmp/mysql', 'mysql_user', 'mysql_password');
if (!
$link) {
die(
'无法连接:' . mysql_error());
}
echo
'连接成功';
mysql_close($link);


// 变体 2:带 localhost
$link = mysql_connect('localhost:/tmp/mysql.sock', 'mysql_user', 'mysql_password');
if (!
$link) {
die(
'无法连接:' . mysql_error());
}
echo
'连接成功';
mysql_close($link);
?>

注释

注意:

每当您将“localhost”或“localhost:port”指定为服务器时,MySQL 客户端库都会覆盖它并尝试连接到本地套接字(Windows 上的命名管道)。如果您想使用 TCP/IP,请使用“127.0.0.1”代替“localhost”。如果 MySQL 客户端库尝试连接到错误的本地套接字,则应将正确的路径设置为 mysql.default_hostphp.ini 中,并将服务器字段留空。

注意:

到服务器的连接将在脚本执行结束时关闭,除非通过显式调用 mysql_close() 提前关闭。

注意:

错误“无法创建 TCP/IP 套接字 (10106)”通常意味着 variables_order 配置指令不包含字符 E。在 Windows 上,如果环境未被复制,则 SYSTEMROOT 环境变量将不可用,PHP 将难以加载 Winsock。

另请参阅

添加注释

用户贡献注释 25 个注释

nicodenboer at yahoo dot com
12 年前
如果你使用 utf8,这里要小心。

你的数据库的 db.opt 文件应该包含以下几行
default-character-set=utf8
default-collation=utf8_general_ci

这意味着你的数据库被创建为使用 utf8 字符集。
实现此目的的一种方法是
CREATE DATABASE my_database DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

然后,从 PHP 连接到它后,你应该使用
mysql_set_charset("UTF8", $connection);

如果你不这样做,当其他软件读写同一个数据库时,你会遇到糟糕的问题!!!!!!
VTool
7 年前
fcgid_module modules/mod_fcgid.so
FcgidMaxRequestLen 209715200
FcgidConnectTimeout 240
FcgidIOTimeout 240
FcgidBusyScanInterval 240
FcgidBusyTimeout 240
# 这行指令告诉 web 服务器识别一个新类型 (php)
AddHandler fcgid-script .php
# 这行告诉 web 服务器 PHP 安装在哪里。
FcgidInitialEnv PHPRC "c:/php"
# 这行告诉 web 服务器当客户端 (浏览器) 请求一个以
# .php 为扩展名的页面时,应该执行 php-cgi.exe 应用。
# 扩展名。
FcgidWrapper "c:/php/php-cgi.exe" .php
# 使用这行,我们赋予客户端访问/执行 .php 文件的必要权限。
# 文件。
<Directory "c:/Apache/htdocs">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride None
Allow from all
</Directory>
cory dot mawhorter gmail.com
15 年前
希望这能帮助某些人避免一些痛苦。

我的开发电脑是 Windows,运行着 wampserver。我经常遇到 PHP 在经历极度数据库活动后无法连接到 MySQL 的问题。

长话短说,这是因为我没有通过命名管道运行 mysql,而 Windows 正在耗尽可用于为 PHP 提供服务的端口。显然,在 Windows 上,你有 5000 个端口可以使用,一旦它们被打开,它们将保持打开状态 120 秒,然后才能被释放。这会导致 mysql/网络问题,因为每个连接都需要一个新端口。

你可以在以下地址阅读更多关于此问题的信息
(链接太长,必须分成几部分)
https://dev.mysqlserver.cn/doc/refman/5.0/en
/can-not-connect-to-server.html#can-not-connect-to-server-on-windows
?>

由于 mysql 在本地主机上,我可以简单地启用命名管道 (如果你不需要网络,则应该这样设置 mysql) 来解决问题,而不是使用该页面上列出的解决方法。

有关详细信息,请参见
https://dev.mysqlserver.cn/tech-resources
/articles/securing_mysql_windows.html
Harouk
13 年前
如果你在使用此命令连接到远程服务器时遇到速度问题,可以在你的 my.cnf 文件中添加 "skip-name-resolve" 行来解决。
martinnitram at excite dot com
20 年前
为了使用来自 mysql 的 load data local infile 函数 (在 mysql 4.0.16、php 4.3.3 中),将 mysql_connect() 的第五个参数设置为 CLIENT_LOCAL_FILES(128),它基于 MYSQL C API (mysql 服务器也支持 load file,通过 "show variables like 'local_infile' " 检查)

感谢 'phpweb at eden2 dot com' 指出这一点
chaoscontrol_hq at yahoo dot com
19 年前
在 MySQL4.1 及更高版本中,默认的密码散列格式已更改,使其与 3.x 客户端不兼容。
我发现当你的 MySQL 用户密码为空时,mysql_connect() 在服务器版本 >= 4.1 上有效,因为在这种情况下不会进行密码验证,否则你需要使用其他连接方法 (例如 mysqli)。
此外,如果你在新的服务器上使用旧的 MySQL 表 (即密码以旧格式存储),那么服务器将自动使用旧的认证方法,并且此函数在所有情况下都应该有效。
希望这能帮助某些人,它让我困惑了一段时间,因为我 4.1 服务器上的某些用户可以连接,而某些用户则无法连接。
amn -at- frognet.net
21 年前
以防你不知道。你可以在函数中使用 mysql_connect 连接到数据库,连接是一个超级全局变量... 这意味着你可以在其他函数或任何函数中使用 mysql_query,PHP 将使用你打开的连接。这是一种方便的知识,对于拥有大量脚本的大型网站很有帮助。如果你创建一个函数来连接到数据库,并在所有脚本中调用该函数,这将使代码维护变得更容易,因为你只需要更新一行代码来更改 mysql 连接,而不是分别更新所有脚本。
pepik at gmail dot cz
11 年前
<?php
$server
= 'y.com';
$login='x';
$pass='x';
$db='x';

$spojeni=mysql_connect($server,$login,$pass) or die ('nelze se pripojit');
mysql_select_db($db,$spojeni);
mysql_query("Set names 'utf8'");
?>
avinc@live,hk
13 年前
我的情况:“我可以通过 Apache 从 PHP 连接到 MySQL,并且可以通过 MySQL 控制台连接到 MySQL,但无法通过 PHP 连接。”

但是,PHP 只能使用 mysql_connect("localhost", "root", "password"); 连接到 MySQL。

“是 selinux 不允许 apache 建立远程连接。”

解决方案
setsebool -P httpd_can_network_connect=1
Anonymous
19 年前
通过 Windows 上的命名管道连接到 mysql

在 my.ini 中,添加以下内容

[mysqld]
enable-named-pipe

然后连接到服务器,然后使用以下命令连接到 mysql

mysql_connect('.')
rui dot batista at netcabo dot pt
18 年前
有没有想过“默认用户名”是什么?
<?php
$link
= mysql_connect() or die(mysql_error());
$result = mysql_query("SELECT SESSION_USER(), CURRENT_USER();");
$row = mysql_fetch_row($result);
echo
"SESSION USER: ", $row[0], "<br>\n";
echo
"CURRENT USER: ", $row[1], "<br>\n";
?>
在我的 win2k 安装中,两者都是 ODBC@localhost,所以我的 Windows 建议是
- 创建一个名为 ODBC 的 MySQL 用户,没有密码
- 将 localhost 添加到 ODBC 用户 [右键点击 ODBC]
- 为 ODBC@localhost 设置模式权限
- 使用 mysql_connect(),不带任何参数,或者根本不使用 ;)
这对于 odbc_connect 也有效
odbc_connect("myDSN", "", "")
tpl99 at yandex dot ru
14 年前
每当你打开两个连接到同一个数据库时,
你很可能在选择不存在的数据库时不会得到任何错误。

<?php
$db1
= mysql_connect( ... );
mysql_select_db('existing_db',$db1);

$db2 = mysql_connect( ... );
mysql_select_db('not_existing_db', $db2);

mysql_query(... , $db2);
// 将不会返回错误,并且查询不会被执行。
?>

注意这一点,你可能会节省几个小时的调试时间。
yangqingrong at wudimei dot com
11 年前
大家好。
对于 php5.4-win7,如果你觉得速度慢,请使用 "127.0.0.1" 代替 "localhost"。因为 win7 默认使用 ipv6。
"localhost" 用于 ipv4。

<?php
$conn
=mysql_connect( "127.0.0.1",
"root",
"pass");
?>
abelcheung at gmail dot com
14 年前
请注意,Windows 上的命名管道在 PHP 5.3 之后不可用,即使在本地主机上也应该使用 TCP 连接。
pascalxusNOSPAM at yahoo dot com
15 年前
我只想分享一个我用于执行单行 SQL 语句的通用包装器。这是一个易于使用的包装器,它负责连接打开/关闭。可选地,可以将 mysql_connect 替换为 mysql_pconnect 以实现持久连接。

function executeQuery( $query, $db, $nocon )
{
if( $nocon != "nocon" )
if( $db != "" ) connect( $db );
else connect( "pascal_crm" );

$result= mysql_query( $query );
$err = mysql_error();
if( $err != "" ) echo "error=$err ";

if( $nocon != "nocon" )
mysql_close();
return $result;
}

这里有一个与 mysql_pconnect 相关的琐事问题
http://www.codesplunk.com/nr/questions/php17.html
arithmetric at gmail dot com
16 年前
如果你尝试使用相同的 MySQL 用户、密码和主机名打开多个独立的 MySQL 连接,则必须设置 $new_link = TRUE 以防止 mysql_connect 使用现有连接。

例如,你正在打开两个独立的连接到两个不同的数据库 (但在同一个主机上,并且使用相同的用户和密码)

$db1 = mysql_connect($dbhost, $dbuser, $dbpass);
$rv = mysql_select_db($dbname1, $db1);
$db2 = mysql_connect($dbhost, $dbuser, $dbpass);
$rv = mysql_select_db($dbname2, $db2);

此时,$db1 和 $db2 都将选择名为 $dbname2 的数据库。

解决方法是要求第二个 MySQL 连接是新的

$db1 = mysql_connect($dbhost, $dbuser, $dbpass);
$rv = mysql_select_db($dbname1, $db1);
$db2 = mysql_connect($dbhost, $dbuser, $dbpass, TRUE);
$rv = mysql_select_db($dbname2, $db2);

现在,$db1 应该选择了 $dbname1,而 $db2 应该选择了 $dbname2。

这在 mysql_select_db 页面上也有记录。

注意:这仅在每个 mysql_connect 语句的服务器、用户名和密码参数都相同的情况下才会发生。
ed dot ac dot uk 的 Graham_Rule
21 年前
这是解决将用户名和密码放入脚本中安全问题的另一种方案。我在其他地方没有找到关于此方案的文档,所以我想建议将其添加到在线文档中。........

不要将 MySQL 密码放入可能被机器上任何用户读取的脚本中。而是将其放入 Apache 配置文件,并确保它不是世界可读的。(Apache 以 root 身份读取其主配置文件。)

例如,将以下内容添加到您的 httpd.conf 文件中(并将其权限设置为 600 或 660),然后告诉 Apache 重新加载自身(apachectl graceful)。

<Directory /var/www/html/mydatabase>
php_value mysql.default_user fred
php_value mysql.default_password secret
php_value mysql.default_host server.example.com
</Directory>

然后,您在 PHP 代码中只需要

$handle = mysql_connect() or die(mysql_error());

密码等只会由在指定目录(或子目录)中运行的脚本获取。对于虚拟主机等也可以做同样的事情。

如果您不想一直重新加载 Apache 服务器,那么您可以将 php_value 指令放入(世界可读的) .htaccess 文件中进行测试。(显然不适合生产环境。)

如果您需要调试正在提供(或未提供)的值,请使用以下代码片段

@syslog(LOG_DEBUG, "Using user=".ini_get("mysql.default_user").
" pass=".ini_get("mysql.default_password").
" host=".ini_get("mysql.default_host"));

(这假设您没有在“safe_mode”模式下运行,并且您正在使用某种 Unix 系统。)
sanjaal dot com 的 bimal
13 年前
便携式连接:如果您将源代码从一台服务器迁移到不同的服务器,并且希望避免在新服务器上重新配置,请使用 $_SERVER['SERVER_NAME'] 标志,如下所示

<?php
switch($_SERVER['SERVER_NAME'])
{
case
'server1.example.com':
mysqlconnect('host1', 'user1', 'password1');
mysql_select_db('db1');
break;
case
'server2.example.com':
mysqlconnect('host2', 'user2', 'password2');
mysql_select_db('db2');
break;
}
?>

这会创建与 MySQL 数据库的条件连接。它会根据运行脚本的服务器名称自动选择正确的服务器。

希望您喜欢这种便携式配置。
napervillegi dot com 的 sholland
14 年前
如果您遇到“无法分配请求的地址”错误,您可能遇到了 MySQL 端口问题。我刚将服务器迁移到 Mac OS X 10.6,mysql_connect 出现了此错误。进入 /etc/php.ini 文件并将默认端口号设置为 3306 修复了问题。

mysql.default_port = 3306

php.ini 文件建议 PHP 将通过使用 $MYSQL_TCP_PORT 或 /etc/services 中的 mysql-tcp 条目来选择端口,但实际情况并非如此。我机器上的 /etc/services 中列出了 3306,但它没有被获取。

这有点像错误报告,因为已记录的功能无法正常工作。请不要删除此内容,直到社区决定如何解决此问题。这是一个让人抓狂的问题,需要解决。
lanar dot com dot au 的 php
12 年前
在将 CentOS 上的 MySQL 服务器从 5.0.9 升级到 5.5.21 后,我的 WinXP 无法连接到主机,并出现以下错误消息
'握手错误'。

最终的解决方案是将 MYSQL_CLIENT_SSL 从对 mysql_connect() 的调用中移除。

我也会将此问题报告为错误。
LinuxIntro dot com 的 Contact
15 年前
当您连接并希望使用存储过程时,您必须通过连接命令将一个特殊标志传递给 MySQL,否则您将不会收到返回的结果,并且会导致以下错误
PROCEDURE AlexGrim.GetStats_ForumCategories 无法在给定上下文中返回结果集

要解决此问题,请更改您的连接字符串,将 ",false,65536" 添加为最后两个字段
$this->con = mysql_connect($this->h,$this->u,$this->p,false,65536);
dedicate dot co dot uk 的 trev
12 年前
如果您脚本经常休眠,并且要运行完全相同的 SQL 语句 2 次或更多次,并且经常遇到“MySQL 连接已断开”错误。

尝试将第四个参数设置为 TRUE,因为它似乎有时 PHP 无法识别它在上次相同查找中使用的资源 ID x 现在已失效,因此尝试使用它,从而绕过 is_resource() 等测试,并导致失败。

当然,这适用于 mysql_ping() 不适合您的情况。
wapkamera dot de 的 david dot schueler
14 年前
如果您遇到类似“#2006:MySQL 服务器已断开”的 MySQL 错误,并且您正在使用 mysql_connect() 和 pcntl_fork(),那么请确保您使用每个创建的子进程重新连接到 MySQL 服务器,这些子进程是使用 fork() 创建的。

我花了几天时间才搞清楚问题,因为我一直在为每个子进程使用相同的 MySQL 连接,并遇到了“MySQL 服务器已断开”错误。

这是一个简单的示例
<?php
$link
= mysql_connect($db_server, $db_user, $db_pass);
mysql_select_db($db_database,$link));

$pid = pcntl_fork();
if (
$pid == -1)
// 分叉子进程时出错
elseif ($pid) {
// 父进程将在这里
} else {
// 子进程必须建立一个*新的* MySQL 连接。
// 如果你不使用第四个参数调用 mysql_connect
// 那么它将使用父进程的连接。但是
// 如果子进程死亡,父进程也将无法使用连接。
// 所以,请注意第四个参数中的 "true"。
$newlink = mysql_connect($db_server, $db_user, $db_pass,true);
mysql_select_db($db_database,$newlink));
// ...
}
?>
avalon-internet dot com 的 bmagilavy
15 年前
如果您尝试连接到远程服务器,可能会出现以下问题。也许此列表可以帮助您节省一些时间

1. 您可能需要联系远程服务器的技术支持

a. 确保您能够通过其防火墙。将您的服务器号列入接收方网站的 cPanel 远程访问主机列表并不一定足够。这取决于服务器公司如何设置;

b. 找出他们用于数据库连接的端口号,这可能与 mysql_connect 使用的默认端口号不同;

c. 如果您使用的是 ODBC,您尝试连接到的主机可能安装了 ODBC 驱动程序,也可能没有安装;

d. 如果您使用的是动态 IP,他们可能已设置了相应配置,或者您可能需要使用代理。请参见 http://forge.mysql.com/wiki/MySQL_Proxy

2. 如果您自己使用的是共享服务器,您在注册信中收到的服务器号可能不是您用于连接到远程数据库的服务器号。您需要的是您网站所在的机器的服务器号,而不是您在该机器上的虚拟帐户服务器号。您可以从您自己的技术支持那里获得此信息。

感谢 Bluehost 的 Jonathan Jones 提供此分析。
gmail dot com 的 i dot linker
13 年前
MySQL 连接字符串正则表达式
~mysql://([^:@/]*):?([^@/]*)@?([^/]*)/?([^/]*)~
To Top