MySQL 函数

注意

注意:

大多数 MySQL 函数接受 link_identifier 作为最后一个可选参数。如果没有提供,则使用最后一个打开的连接。如果不存在,则尝试使用 php.ini 中定义的默认参数建立连接。如果失败,函数将返回 false

目录

添加注释

用户贡献注释 38 个注释

3
arnold_dba
16 年前
此外,为了保护 MySQL 数据并能够遵守 PCI 标准,您应该加密数据。有许多方法可以做到这一点。对于黑客,您可以使用 dm-crypt (www.saout.de/misc/dm-crypt) 工具。它基本上用于加密整个分区。如果您想要一个复杂的解决方案,请使用来自 Packet General (www.packetgeneral.com) 的 Security-GENERAL for MySQL。
在 Windows 上,您可以使用 Windows 自身提供的磁盘加密功能或像 TrueCrypt (www.truecrypt.org) 这样的工具。
1
matiyahoo-publico at yhoo dot com dot ar
16 年前
David

在这行

$query = "SELECT username FROM users WHERE username REGEXP '$username[0-9*]'";

PHP 可能会读取 $username[, *包括* 开方括号,并且可能会认为您试图进入数组。

您应该改为使用此方法

$query = "SELECT username FROM users WHERE username REGEXP '${username}[0-9*]'";

或者可能是这样

$query = "SELECT username FROM users WHERE username REGEXP '$username" . "[0-9*]'";
0
dhirendrak at yahoo dot com
16 年前
<?php
# 由 dhirendra 创建,联系方式:dhirendrak at yahoo dot com
# 此脚本用于检查两个表之间的数据差异
# 两个表的结构相同。
# 限制:
# 1) 两个表的结构必须相同。
# 2) 两个表名称不同,如果相同,则第二个表必须位于不同的数据库中。
# 3) 如果使用两个数据库,则两个数据库的权限必须相同,因为我使用别名来获取信息。
#
# 用途:
# 1) 当您对现有的脚本进行一些更改并期望得到特定的输出时,这可能很有用。因此,借助此功能,您可以比较脚本更改带来的影响。
#
#

$host=""; # 主机名或 IP 地址
$user=""; # 数据库用户名
$pass=""; # 数据库密码
$database=""; # 您想要连接的数据库名称

# 获取与 MySQL 的连接
$dblink = @mysql_connect($host,$user,$pass);

# 选择并打开数据库
mysql_select_db($database,$dblink);

$db1="< 您的 db1 >"; // 第一个数据库
// 第二个数据库,如果两个表都使用同一个数据库,则使用与 db1 相同的值
$db2="< 您的 db2 >";
$table1="< 您的 table1 >"; // 第一个表
// 第二个表,如果两个表都使用同一个数据库,则表名称
# 必须不同,但字段名称相同,并且字段顺序相同。

$table2="< 您的 table2 >";

// 函数从这里开始
function table_data_difference($first,$second)
{
global
$dblink;
$sql1 = "SHOW FIELDS FROM $first";
$result = mysql_query($sql1,$dblink) or die("执行 1 时出错 ==".mysql_error());

while(
$row = mysql_fetch_object($result))
{
$from_fields[]=$row->Field;
}

$sql="select * from $first";
$res=mysql_query($sql,$dblink) or die("执行 2 时出错 ==".mysql_error());
$j=1;
while(
$row=mysql_fetch_array($res))
{

$num=count($from_fields);

$sql_next="select $second.* from $second where";

for(
$i=0;$i < $num;$i++)
{
$sql_next=$sql_next." ".$second.".".$from_fields[$i]."='".$row[$from_fields[$i]]."' and ";
}

$sql_next=substr($sql_next,0,strlen($sql_next)-5);

$res_next=mysql_query($sql_next,$dblink) or die("执行 3 时出错 ==".mysql_error());
$num1=mysql_num_rows($res_next);
if(
$num1==0)
{
for(
$i=0;$i < count($from_fields);$i++)
{
$val=$val."<br>".$from_fields[$i]."=".$row[$from_fields[$i]];
}
// 显示未匹配的记录。
echo "<br>\n".$j.".".$val;
echo
"<br>-----------------------------------------------------";
$j++;
}

}

}

$first=$db1.'.'.$table1;
$second=$db2.'.'.$table2;

table_data_difference($first,$second);

?>
0
rad14701 at yahoo dot com
16 年前
@Amanda 12-Oct-2007 09:58

我几乎要问自己,这是否是真问题...... 如果 MySQL 服务器拒绝连接尝试,那么,是的,MySQL 将能够将错误信息发送回 PHP ...... 并且如果 PHP 根本无法访问目标 MySQL 服务器,那么它也会足够智能,自行发出相应的错误信息 ......
0
php comments of fuzzyworm co., uk
18 years ago
如果您想让 PHP 在 Windows 系统下(包括 Apache)与 MySQL 良好配合,请尝试使用 Apache Friends 的 XAMPP。它可以节省配置文件的麻烦,而这是在 Windows 下让这三者协同工作的主要问题。

http://www.apachefriends.org/en/xampp-windows.html
0
claude(at)claude(dot)nl
18 years ago
关于资源的一点说明

当资源(例如链接标识符)超出范围时,它将被删除,并且相关联的计算机资源(例如与数据库的 tcp 链接)也将被终止。到目前为止,一切都很好!
但是,在以下代码中,tcp mysql 链接将一直持续到执行结束
<?php
$conn
= mysql_connect('hostname', 'username','password');
$conn = null;
sleep (30);
?>
这是因为在内部保存了链接标识符,以便后续的 mysql 函数可以正常工作。似乎没有办法删除此内部引用。
但是,如果您要打开 2 个连接,则最旧的那个连接将被自动删除(因此,与 hostname 的连接将在 $conn=null 语句处终止,与 hostname2 的连接将一直持续到脚本结束)。
<?php
$conn
= mysql_connect('hostname', 'username','password');
$conn2 = mysql_connect('hostname2', 'username','password');
$conn = null;
$conn2 = null;
sleep (30);
?>
0
arjen at mysql dot com
19 years ago
John Coggeshall 为仍然使用旧的 ext/mysql 函数的应用程序编写了一个 PHP5 ext/mysqli 兼容性脚本。这可以避免在 PHP5 中同时加载 mysql 和 mysqli 扩展的麻烦,这可能很棘手。

该脚本位于
http://www.coggeshall.org/oss/mysql2i/
0
Microsoul V3
19 years ago
我使用的是 IIS 6、PHP 5.04、Windows Server 2003 和 MySQL 4.1.11。以下是我的发现。
要让 MySQL 和 PHP 互相通信,请在 php.cfg 中不要忘记启用以下标记
cgi.force_redirect = 0,并确保将其设置为 0(默认值为 1。只需删除前面的分号即可在代码中激活它)。然后,phpinfo 将显示它从 PHP 安装目录而不是 Windows 根目录读取 cfg。然后,您的 phpinfo 将显示 MySQL 条目,有些人可能难以找到它。无需进行注册表设置或复制任何内容。此外,请按照用户评论中的其他优秀帮助信息进行操作。以下是我所做的操作,以确保简单明了
我在 program files(浏览您的计算机)上方文件夹树中创建了一个名为 PHP 的文件夹。我将 .zip php 版本解压缩到该文件夹中(而不是自动安装版本)。我编辑了 php.ini-recommended,将其重命名为 php,添加了我的 SQL 用户名、数据库名称等(您真的需要仔细查看 cfg 文件,确保没有遗漏任何内容)。启用 extension=php_mysql.dll(只需删除前面的分号)。将 php 文件夹添加到 PATH(有关如何执行此操作的说明非常简单,并且已在上面进行了说明)。我还将 ext 文件夹提供给 PATH,但我不确定这是否真的必要。用户评论对我帮助很大,所以我希望能够回报,并尝试更深入地探讨此主题。
0
medic at setiherbipolis dot de
19 years ago
客户端不支持服务器请求的身份验证协议;请考虑升级 MySQL 客户端。

这意味着您使用的是旧版本的 MySQL 客户端(可能不是 mysqli)。

MySQL 的身份验证协议在 4.1 版本中发生了改变。

要了解您正在使用哪个版本的 mysql-client,请尝试使用 phpinfo()。
0
skelley at diff dot nl
22 年前
您好,这是一个在 3.23 版本之前的 MySQL 数据库中从表中随机选择记录的小技巧。

SELECT *, (ItemID/ItemID)*RAND() AS MyRandom FROM Items ORDER BY MyRandom

【编辑注:在 3.23 版本之后,您可以使用“SELECT * FROM foo ORDER BY RAND()”】
-1
atk2 at hotmail dot com
17 年前
在最终在我的新 Windows XP 计算机上安装了 IIS、PHP 和 MySQL 后,我决定将我采取的步骤写下来,以便您可以了解它是如何完成的: http://www.atksolutions.com/articles/install_php_mysql_iis.html

希望这能有所帮助。
-1
SID TRIVEDI
16 年前
<?php
/*
在运行 Apache 的 32 位 Windows XP 上安装 MySQL (Community) Server

在 Windows 上,推荐将 MySQL 作为 Windows 服务安装,以便 MySQL 在 Windows 启动和停止时自动启动和停止。作为服务安装的 MySQL 服务器也可以从命令行命令或使用图形服务实用程序(如 phpMyAdmin)进行控制。

PHP ---> MySQL 连接器(php_mysql.dll 和 php_mysqli.dll 作为扩展)
MySQL 为 MySQL 版本 4.1.16 及更高版本、MySQL 5.0.18 和 MySQL 5.1 在 Windows 操作系统上提供了 mysql 和 mysqli 扩展,您可以在 https://dev.mysqlserver.cn/downloads/connector/php/ 上找到它们。与在 php.ini 中启用任何 PHP 扩展(如 php_mysql.dll)一样,PHP 指令 extension_dir 应设置为 PHP 扩展所在的目录。

MySQL 默认不再启用,因此必须在 php.ini 中启用 php_mysql.dll DLL。此外,PHP 需要访问 MySQL 客户端库。名为 libmysql.dll 的文件包含在 Windows PHP 发行版中,为了让 PHP 与 MySQL 交谈,此文件需要对 Windows 系统的 PATH 可用。

以下 PHP 脚本可用于测试 PHP 与 MySQL 的连接。
*/

//$connect = mysql_connect("您的主机名", "MySQL 根目录", 'MySQL 密码(如果有)');
//$connect = mysql_connect("主机名或地址 - 127.0.0.1", "root", 'password');
$connect = mysql_connect("localhost", "root", 'password');
if (
$connect){
echo
"恭喜!\n<br>";
echo
"成功连接到 MySQL 数据库服务器。\n<br>";
}else{
$error = mysql_error();
echo
"无法连接到数据库。错误 = $error。\n<br>";
exit();
}

// 关闭连接
$close = mysql_close($connect);
if (
$close){
echo
"\n<br>";
echo
"现在正在关闭连接...\n<br>";
echo
"MySQL 连接也已成功关闭。\n<br>";
}else{
echo
"关闭 MySQL 连接时出现问题。\n<br>";
}
exit();
?>
-1
richard at NOSPAM dot dimax dot com
18 years ago
针对 Conrad Decker 以下帖子的回复

如果您的表包含外键约束,则您将无法从 mysqldump 创建的数据文件正确恢复。

mysqldump 以字母顺序转储表数据,而不是外键约束所需的逻辑顺序。
-1
noel at nettensity dot com
19 years ago
在 Windows Server 2003/IIS 6.0 中启用 MySQL
首先找到您的 php.ini 文件,检查 phpinfo() 以查看 php 目前在何处查找 php.ini。(例如,使用 PHP 5.0.4 的 Windows 安装程序,php.ini 文件被放置在 C:\Windows 目录中。)但是,我建议您不要使用安装程序 - 使用完全手动安装。

在 php.ini 中设置以下内容
display_errors = on
error_reporting = E_ALL
这将确保您在配置过程中看到任何发生的错误。配置完成后,请务必更正这些错误!不要在生产机器上保留这些设置。

在 php.ini 中设置以下内容
extension_dir = "pathtoextensions(通常为 [yourpathtophp]\ext)"
extension=php_mysql.dll(确保如果它已在您的 php.ini 中,则取消注释)

在 IIS 中,打开 Web 服务扩展,单击“添加新的 Web 服务扩展...”
在扩展名下输入 PHP
在所需文件下
添加 [yourpathtophp]\php5isapi.dll
添加 [yourpathtophp]\php5ts.dll
单击“应用”,然后单击“确定”。

像往常一样创建网站,但确保它们具有可执行权限,而不仅仅是脚本访问权限。在“主目录”选项卡中,单击“配置”。向下滚动顶部列表,看看是否可以找到 PHP。如果找到,请确保 PHP 可执行文件的路径正确。如果您在列表中找不到 PHP,请单击“添加...”,然后浏览到正确的可执行文件 [yourpathtophp]\php5isapi.dll,然后单击“确定”。在扩展字段中,输入“PHP”。动词应该已经设置为“所有动词”,保持原样。

使用以下代码创建测试页面
<? echo(phpinfo()); ?>
将其命名为 test.php,并将此文件放置到您刚创建的网站中。浏览到该页面,最好使用 Firefox ;),并确保您有一个包含一些 MySql 信息的 MySql 部分。如果没有,那么您的路径可能设置错误,或者您仍然没有编辑正确的 php.ini(再次查看 phpinfo() 显示的位置,如果必须,直接在该位置进行编辑,然后将其移动并重新配置)。

希望这能有所帮助!
-1
mijnpc at xs4all dot nl
21 年前
如果您有一台运行带有 PHP 的 Web 服务器的 Windows 计算机,则无需安装 MySQL 服务器即可本地测试脚本,前提是您有权建立到远程 Web 服务器的 Secure Telnet 连接(端口 22)。

为此,您需要一个支持端口转发的 Secure Telnet 客户端。
在建立连接之前,请定义端口转发。
将本地端口 3306 转发到 [远程服务器的名称或 IP 地址]:3306
确保本地端口接受来自其他主机的连接
保存此会话

使用用户名和密码连接到远程服务器
最小化 shell,就可以了...

您可以使用与在远程服务器上工作时相同的用户名(和密码)!
例如:$link = mysql_connect("localhost", "root", "") or die("no way jose");

您可能会在 xx 分钟后收到 shell 超时,具体取决于您的远程服务器,只需重新连接或每隔一段时间在 shell 中按 Enter 键...

一个出色的免费 Secure Telnet 客户端示例是 Putty:Putty:http://www.chiark.greenend.org.uk/~sgtatham/putty/

这个“发现”确实为我节省了很多时间,因为我不必一次又一次地将脚本上传到远程服务器,按下 [保存] 就足够了,哈哈 (-
-1
avis_del at yahoo dot com
18 years ago
我同意 j at jonathany.com

PHP 5.04 到 MySQL,
php_mysql.dll 在 Windows 安装程序 (.msi) 中找不到
只需从 .zip 文件(可以下载)中解压即可。
它可以工作。

1. cgi.force_redirect = 0
2. extension_dir = "c:\php\ext"
3. extension=php_mysql.dll

直到在 phpinfo.php 中显示

MySQL 支持已启用
活动持久连接 0
活动连接 0
客户端 API 版本 4.1.12
-1
Protik Mukherjee
19 years ago
Fedora mysql 问题!
在 Fedora 3 中,php mysql 模块没有包含在默认安装中。要安装它,请使用 $>yum install php_mysql
如果您没有这样做,您将遇到 mysql 函数(如 mysql_connect())的错误。

希望这能有所帮助!
-1
vbolshov at rbc dot ru
18 years ago
我最近在配置与 mysql 相关的 php 扩展(即 mysql 和 pdo_mysql)时遇到了问题。后来我发现这不是 PHP 问题,而是 MySQL 问题 - libmysqlclient 没有与二进制下载一起提供。我从源代码构建了 MySQL,然后两个扩展都成功编译了。
-1
yp
18 years ago
在使用 Fedora Core linux Mysql rpm 安装时。
按如下方式配置以加载 mysql 头文件。
./configure --with-mysql=/usr/
请记住在编译之前使用 make clean 删除旧的配置。
-1
aidan at php dot net
19 years ago
如果您想复制 `mysql --html` 的输出,将结果打印在 HTML 表格中,请参见此函数

http://aidanlister.com/repos/v/function.mysql_draw_table.php
-1
匿名
19 years ago
如果您在 Windows 2003 服务器(又名 Win 2k3)上安装 PHP5,并且需要 MySQL 使用 php_mysql.dll 或 php_mysqli.dll 或同时使用两者来工作,而 MySQl 没有出现在 phpinfo 中,那么您的 php.ini 可能没有加载。在 PHP 5 zip 文件的说明中,他们会告诉您将您的 PHP 安装目录添加到您的 Windows 路径中。这应该告诉 php 从哪里加载它的 php.ini,但它没有这样做。如果您想使其工作,则无需像每个人建议的那样将任何 DLL 复制到任何位置。您只需将以下注册表项添加到 Windows

[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
"IniFilePath"="C:\\PHP"

只需将以上两行代码复制到文本文件并保存文件为 php_ini_path.reg

保存文件后,它将看起来像注册表文件。只需双击它。

这将使 PHP 在 C:\PHP 中查找您的 php.ini。我假设您可以编辑它,如果您将 php 安装到其他位置,但我没有尝试过。

运行 reg 文件后,请确保您的 php.ini 位于您的 PHP 目录中,并确保所有适当的设置都已设置。这将使您启动并运行。确保您还遵循有关如何在 IIS 中使其工作的所有步骤。这只是说明的补充。
-2
Vladimir Kosmala
13 年前
这里有一个 mysql 助手,它包含 mysql 扩展的主要函数。对于初学者来说很容易理解,而且非常有用,因为查询是安全的。它理解您的意图,只需编写您的 SQL 查询即可。我将其命名为 mysql_magic。

<?php
// 示例
$nb_affected = mysql_magic('delete from users');
$nb = mysql_magic('select count(*) from users');
$one_row = mysql_magic('select * from users limit 1');
$all_rows = mysql_magic('select * from users where name = ?', 'John');
$id = mysql_magic('insert into users(name,rank) values(?,?)', 'Vincent', 3);
?>

<?php
// 用法: mysql_magic($query [, $arg...]);
function mysql_magic()
{
global
$dblink, $sqlhost, $sqluser, $sqlpass, $sqlbase;
$narg = func_num_args();
$args = func_get_args();

if (!
$dblink)
{
$dblink = mysql_connect( $sqlhost, $sqluser, $sqlpass );
mysql_select_db( $sqlbase, $dblink );
}

$req_sql = array_shift($args);
$req_args = $args;

$req_query = mysql_bind($req_sql, $req_args);
$req_result = mysql_query($req_query);

if (!
$req_result)
{
trigger_error(mysql_error());
return
false;
}

if (
startsWith($req_sql, 'delete') || startsWith($req_sql, 'update'))
{
return
mysql_affected_rows(); // -1 || N
}
else if (
startsWith($req_sql, 'insert'))
{
return
mysql_insert_id(); // ID || 0 || FALSE
}
else if (
endsWith($req_sql, 'limit 1'))
{
return
mysql_fetch_assoc($req_result); // [] || FALSE
}
else if (
startsWith($req_sql, 'select count(*)'))
{
$line = mysql_fetch_row($req_result);
return
$line[0]; // N
}
else
{
return
mysql_fetch_all($req_result); // [][]
}
}

function
mysql_bind($sql, $values=array())
{
foreach (
$values as &$value) $value = mysql_real_escape_string($value);
$sql = vsprintf( str_replace('?', "'%s'", $sql), $values);
return
$sql;
}

function
mysql_fetch_all($result)
{
$resultArray = array();
while((
$resultArray[] = mysql_fetch_assoc($result)) || array_pop($resultArray));
return
$resultArray;
}

function
startsWith($haystack,$needle,$case=false) {
if(
$case){return (strcmp(substr($haystack, 0, strlen($needle)),$needle)===0);}
return (
strcasecmp(substr($haystack, 0, strlen($needle)),$needle)===0);
}

function
endsWith($haystack,$needle,$case=false) {
if(
$case){return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);}
return (
strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);
}
?>

不要忘记设置 $sqlhost, $sqluser, $sqlpass 和 $sqlbase。

借助
mysql_bind : https://php.net/manual/en/function.mysql-real-escape-string.php#96391
mysql_fetch_all : https://php.net/manual/en/function.mysql-fetch-assoc.php#90030

trigger_error 可以用这个技巧来增强:https://php.net/manual/en/function.trigger-error.php#98910
-2
davesteinb at yahoo dot com
18 years ago
我创建了这个函数来减少数据库调用。你可以将 MySQL 结果存储在会话变量中,并对任何列进行排序。可能在 AJAX 应用中很好用。

<?

function mysql_sort($results, $sort_field, $dir="ASC") {
$temp_array = array();
$i=0;
foreach ($results as $res) {
$temp_array[$i] = $res[$sort_field];
$i++;
}
if ($dir=="ASC") {
asort($temp_array);
} else {
arsort($temp_array);
}

$new_results = array();
$i=0;
foreach($temp_array as $k => $v) {
$new_results[$i] = $results[$k];
$i++;
}
ksort($new_results);
return $new_results;

}

// 使用
if (count($_SESSION["res"])==0) {
$_SESSION["res"] = [获取数据库结果,无论你使用何种方法]
}

$_SESSION["res"] = mysql_sort($_SESSION["res"], $_REQUEST["sort"], $_REQUEST["dir"]);

?>
<table>
<tr>
<td><a href="page.php?sort=f_name&dir=<? echo ($_REQUEST["dir"]=="ASC") ? "DESC":"ASC"; ?>">First</a></td>
<td><a href="page.php?sort=l_name&dir=<? echo ($_REQUEST["dir"]=="ASC") ? "DESC":"ASC"; ?>">Last</a></td>
</tr>

<? foreach ($_SESSION["res"] as $r) {?>
<tr>
<td><?=$r["f_name"]?></td>
<td><?=$r["l_name"]?></td>
</tr>
<? } ?>
</table>
-1
nleippe at integr8ted dot com
19 years ago
trace_mode 中断了 SQL_CALC_FOUND_ROWS。
这是因为它在发送 <query> 本身之前发出一个 EXPLAIN <query>,因此后续的 SELECT FOUND_ROWS() 不再是下一个连续查询,结果为零。
这对 MySQL 4.0.21 和 4.1.5gamma 至少是正确的。
(PHP 4.3.9)
-1
irn-bru at gmx dot de
20 年前
请注意,sql.safe_mode 配置设置会影响所有 mysql_* 函数。这与 PHP 安全模式无关,请检查 php.ini 中的 [SQL] 部分。

我发现,如果你设置 sql.safe_mode = On,mysql_connect 将忽略提供的用户名和密码,而是使用脚本所有者(在 Debian 上验证过)。

Brian
-2
mw-php at ender dot com
23 年前
mysql_fetch_[row|object|array] 函数将数据返回为字符串类型。由于 PHP 变量的灵活特性,这通常并不相关,但如果你碰巧从数据库中检索两个整数,然后尝试用按位运算符进行比较,你就会遇到麻烦,因为 (19 & 2) == 2,但 ("19" & "2") == 0。为了解决这个问题,如果你用数据库中的变量进行按位运算,在比较之前使用 settype() 函数将你的变量显式转换为整数。
-2
sb at stephenbrooks dot org
18 years ago
我正在更换 Web 主机,我的上一家主机提供了一个数据库的“转储”,它以一系列 SQL 请求的形式出现,这些请求(我假设)必须按顺序执行才能在另一个系统上重建数据库。它是使用“MySQL dump 9.11”生成的。查询以分号和换行符结束,而注释行以双连字符开头。下面的脚本打开到 SQL 服务器的连接,并将此格式的转储文件 $file 加载到数据库 $dest_db 中。

function load_db_dump($file,$sqlserver,$user,$pass,$dest_db)
{
$sql=mysql_connect($sqlserver,$user,$pass);
mysql_select_db($dest_db);
$a=file($file);
foreach ($a as $n => $l) if (substr($l,0,2)=='--') unset($a[$n]);
$a=explode(";\n",implode("\n",$a));
unset($a[count($a)-1]);
foreach ($a as $q) if ($q)
if (!mysql_query($q)) {echo "Fail on '$q'"; mysql_close($sql); return 0;}
mysql_close($sql);
return 1;
}

如果“;\n”序列出现在查询内部,这可能并不严密,但我希望它能帮助那些拥有此类转储文件的人。
-2
Joe Greklek
18 years ago
我看到很多新手在最初没有安装扩展时感到沮丧,所以这里有一个针对 Windows 的快速教程。

使用 php5 安装程序是可以的。只需确保也获取 php5 的 .zip 或“手动”版本。

像安装其他应用程序一样安装它。非常简单。不要忘记在安装结束时,在最后一个消息框中设置提到的安全设置。接下来,如果您将 php 安装到 c:\php,则需要将它添加到您的 PATH 环境变量中。这是非常重要的一步。

现在打开 php5 的 .zip 手动版本,并将 ext 文件夹和“libmysql.dll”提取到“c:\php\”。

您*必须*将 libmysql.dll 和 ext 文件夹的安全权限设置为 IUSR_"MACHINE_NAME" 的 READ/READ&EXECUTE。例如我的机器名为 master<acct = IUSR_MASTER>。如果您不这样做,您将收到一个 ******.dll - Access Denied。类型消息。

接下来编辑您的 php.ini 文件,它通常位于 c:\windows\ 中。
找到 extension_dir 变量的行,并将其改为
extension_dir = "c:\php\ext\"

然后向下滚动一点,找到以下几行
;extension=php_mbstring.dll
;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_exif.dll
;extension=php_fdf.dll
;extension=php_filepro.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_ifx.dll

只需删除您要加载的每个扩展的冒号。例如
extention=php_mysql.dll
等等。

现在只需重新启动,一切就应该正常了。随意查询。您基本上只需要重新启动来更新 PATH 环境变量。希望这能帮到至少一个人:)
-2
mbabcock-php at fibrespeed dot net
23 年前
由于没有用于启动和结束/回滚事务的函数,您必须使用 mysql_query("BEGIN")、mysql_query("COMMIT") 和 mysql_query("ROLLBACK")。这些只会在支持事务的表上正常工作。您可能还想编写自己的 mysql_begin(等等)函数,这些函数为您运行上述查询。
-3
joachimb at gmail dot com
16 年前
懒人日志

<?php
/// 创建一个名为 $table 的表,如果不存在,则为 (id, when, message),并在其中插入一行,其中包含 $message。
/// 如果没有给出连接详细信息,它将使用当前数据库连接。数据库和 when 也是如此。
///
/// @returns 成功时返回 TRUE,失败时返回 FALSE。
///
/// @example mysql_put_contents("orders", "I CAN HAZ CHEEZBURGER?", "mysite", NULL, "127.0.0.1:3306", "mysite_user", "secret") or die(mysql_error());
/// @example mysql_put_contents("guestbook", "Longcat says: I'm loooooooooooong") or die("Errorz!");
function mysql_put_contents($table, $message, $database = NULL, $when = NULL, $host = NULL, $user = NULL, $pass = NULL) {
if(
$host)
mysql_connect($host, $user, $pass);
if(
$database)
mysql_select_db($database);

$qry = "CREATE TABLE IF NOT EXISTS `$table` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`when` TIMESTAMP DEFAULT NOW(),
`message` TEXT NOT NULL
);"
;
$result = mysql_query($qry);
if(
$result === FALSE)
return
FALSE;

$qry = "INSERT INTO `$table` VALUES(NULL, ".($when ? $when : 'NULL').", '".mysql_real_escape_string($message)."');";

$result = mysql_query($qry);
if(
$result === FALSE)
return
FALSE;

return
TRUE;
}

?>
-3
nick smith
18 years ago
我在这方面还很新手,但刚好在 Windows XP 上成功设置了 apache 2.0.54、php 5.0.4 和 mySQL 4.1.13,还有 phpMyAdmin 2.6.4,也遇到了很多人报告的完全相同的问题。事实上,在我尝试使用 phpmyadmin 并且它告诉我检查我的 php/mysql 配置之前,我并不知道 mySQL 没有加载到 php 中。

基本上,我只是做了其他人提到的所有事情(将 extension_dir 设置为 c:\php\ext(而不是 c:\php\ext\),从 php.ini 中取消注释 extension=php_mysql.dll,并将 c:\php 放入我的 PATH 中),但我仍然在尝试启动 apache 时收到那个令人沮丧的信息,提示找不到 php_mysql.dll。

我重新启动了机器,它就工作了!看来我必须在编辑我的 PATH 后重新启动 Windows。我并没有在它成为最后手段之前就重新启动,因为在 XP 上,我之前从未需要这样做过——对系统变量的更改总是立即生效。我能理解在比如 Windows 98 上需要这样做,因为您将 PATH 的添加内容放入了您的 autoexec.bat 中,但是为什么我在 XP 上需要这样做就有点神秘了。

无论如何,试一试,它可能可以帮您省下珍贵的头发!

N.
-3
mega-squall at caramail dot com
17 年前
对于 Windows 用户,请注意

如果 apache 安装为服务,并且您更改 PATH 变量以使其能够访问 libmysql.dll,则需要重新启动计算机才能使更改生效。
-3
david at kiwi dot com
16 年前
我想递增用户名,这些用户名应该是 A-Z 或 a-z 的字母字符,如果有人使用“abc”,它将自动被赋予“abc1”,而下一个申请相同用户名的人将自动被赋予“abc2”,下一个将被赋予“abc3”,以此类推。如果我在 MySQL 中输入以下内容:

SELECT username FROM users WHERE username REGEXP 'abc[0-9*]';

结果是

abc1
abc2
abc3

我从另一个论坛获得了以下脚本,但它不起作用;

<?php
$username
= 'abc';
$query = "SELECT username FROM users WHERE username LIKE '$username%'";
$res = mysql_query($query);
while(
$row = mysql_fetch_assoc($res)) {
$n = str_replace($username, '', $row['username']);
if (
$old_n+1!=$n) {
$new_user = $username . ($old_n+1);
break;
}
}
?>

除了脚本无法正常工作之外,“LIKE”函数也不合适,因为如果用户名被申请为“blue”,它将选取用户名“blue1”和“bluebird1”,因此“REGEXP '$username[0-9*]'”似乎是唯一或正确的选项。

我已经尝试将 REGEXP 选项与代码的其余部分结合使用,但似乎 PHP 不会与以下内容交互:

$query = "SELECT username FROM users WHERE username REGEXP '$username[0-9*]'";
-4
Nobody Special
17 年前
这个 PHP5 专属类被用来避免传递 $db。感谢 arjen at queek dot nl 提供的示例。

<?php
class SQL {
private
$db;
public function
__construct($host="localhost",$user="root",$pass="",$db="") {
$this->db = @mysql_connect($host, $user, $pass);
if(!
$this->db) die(@mysql_error());
if(
$db != "") $dbs = @mysql_select_db($db);
if(!
$dbs) die(@mysql_error());
}
public function
__destruct() {
@
mysql_close($db);
}
public function
__call($function, $arguments) {
array_push($arguments, $this->db);
$return = call_user_func_array("mysql_".$function, $arguments);
if(!
$return) die(@mysql_error());
}
}

$db = new SQL();
$query = $db->query("SELECT * FROM this_table WHERE my_variable='1'");
$fetch = $db->fetch_array($query);
print_r($fetch);
?>
-4
admin at mihalism dot com
17 年前
这是一个易于使用的 MySQL 类,适用于任何网站

<?php
class mysql_db{
//+======================================================+
function sql_connect($sqlserver, $sqluser, $sqlpassword, $database){
$this->connect_id = mysql_connect($sqlserver, $sqluser, $sqlpassword);
if(
$this->connect_id){
if (
mysql_select_db($database)){
return
$this->connect_id;
}else{
return
$this->error();
}
}else{
return
$this->error();
}
}
//+======================================================+
function error(){
if(
mysql_error() != ''){
echo
'<b>MySQL Error</b>: '.mysql_error().'<br/>';
}
}
//+======================================================+
function query($query){
if (
$query != NULL){
$this->query_result = mysql_query($query, $this->connect_id);
if(!
$this->query_result){
return
$this->error();
}else{
return
$this->query_result;
}
}else{
return
'<b>MySQL Error</b>: Empty Query!';
}
}
//+======================================================+
function get_num_rows($query_id = ""){
if(
$query_id == NULL){
$return = mysql_num_rows($this->query_result);
}else{
$return = mysql_num_rows($query_id);
}
if(!
$return){
$this->error();
}else{
return
$return;
}
}
//+======================================================+
function fetch_row($query_id = ""){
if(
$query_id == NULL){
$return = mysql_fetch_array($this->query_result);
}else{
$return = mysql_fetch_array($query_id);
}
if(!
$return){
$this->error();
}else{
return
$return;
}
}
//+======================================================+
function get_affected_rows($query_id = ""){
if(
$query_id == NULL){
$return = mysql_affected_rows($this->query_result);
}else{
$return = mysql_affected_rows($query_id);
}
if(!
$return){
$this->error();
}else{
return
$return;
}
}
//+======================================================+
function sql_close(){
if(
$this->connect_id){
return
mysql_close($this->connect_id);
}
}
//+======================================================+
}

/* Example */

$DB = new mysql_db();
$DB->sql_connect('sql_host', 'sql_user', 'sql_password', 'sql_database_name');
$DB->query("SELECT * FROM `members`");
$DB->sql_close();
?>
-5
soren at byu dot edu
21 年前
假设您想从纯文本密码生成一个 MySQL 密码哈希。通常,您只需提交 MySQL 查询 "SELECT PASSWORD('password')",但如果由于某种原因您无法直接访问 MySQL 数据库,那么可以使用以下函数(直接从 MySQL 源代码翻译)

<?php
function mysql_password($passStr) {
$nr=0x50305735;
$nr2=0x12345671;
$add=7;
$charArr = preg_split("//", $passStr);

foreach (
$charArr as $char) {
if ((
$char == '') || ($char == ' ') || ($char == '\t')) continue;
$charVal = ord($char);
$nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8);
$nr2 += ($nr2 << 8) ^ $nr;
$add += $charVal;
}

return
sprintf("%08x%08x", ($nr & 0x7fffffff), ($nr2 & 0x7fffffff));
}
?>

示例

<? print mysql_password("hello"); ?>

输出

70de51425df9d787

这与您在 MySQL 中直接执行 "SELECT PASSWORD('hello')" 获得的结果相同。希望您永远不会遇到需要使用它的情况,但如果您需要它(就像我一样),它就在这里。
-4
allan666 at NOSPAM dot gmail dot com
19 years ago
[编辑注:在 MySQL v5.0+ 中,您可以使用 INFORMATION_SCHEMA 表来检索有关表、视图、数据库等的信息。[email protected]]

这里有一个解析 MySQL 创建表 DDL 的小程序。该函数接受一个包含创建表的 SQL 代码的字符串,并返回表名、表字段、表主键字段和字段类型,所有这些都以数组形式给出(除了表名,当然)。该函数要求主键命名为“id”,外键命名为“id...”。所有外键类型都应该为 int(或其变体,bigint 等)。所有这些限制都可以轻松地修改以满足其他需求。

这是一个 DDL 代码示例。

CREATE TABLE `telefones` (
`id` int(11) NOT NULL auto_increment,
`id_tipo_telefone` int(11) NOT NULL default '0',
`numero` varchar(15) NOT NULL default '',
`id_pessoa` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `id_tipo_telefone` (`id_tipo_telefone`),
KEY `id_pessoa` (`id_pessoa`),
CONSTRAINT `0_775` FOREIGN KEY (`id_tipo_telefone`) REFERENCES `tipos_telefone` (`id`),
CONSTRAINT `0_776` FOREIGN KEY (`id_pessoa`) REFERENCES `pessoas` (`id`)
) TYPE=InnoDB

返回

$tbname = "telefones"
$fields = array("numero");
$kfields = array("id_tipo_telefone","id_pessoa");
$tipos = array("varchar");

希望对您有所帮助...

<?php
function parseQuery($Q, &$tbname, &$fields, &$kfields, &$tipos) {

/** 正确解析的规则:
*
* 1 - 主键必须命名为“id”
* 2 - 外键必须命名为“id...” 例如:id_field
* 3 - 建议使用小写字母
*/

$Q = str_replace(array(chr(10),chr(13))," ",$Q);
$Q = str_replace(array("'","`")," ",$Q);

preg_match("/([^(]*)\((.*)\)(.*)/",$Q,$A);

$part1 = $A[1];
$part2 = $A[2];
$part3 = $A[3];

preg_match("/(.*) ([a-zA-Z_]+)/",$part1,$A);

$tbname = strtolower($A[2]);

$temp = split(",",$part2);
foreach (
$temp as $t) {
preg_match("/ *([a-zA-Z_]+) +([a-zA-Z_]+)(.*)/",$t,$A);
$pcampo = strtolower($A[1]);
$ptipo = strtolower($A[2]);
if (!
preg_match("/$pcampo/","primary key constraint id unique foreign") ) {
if ( (
$pcampo[0] == "i") && ($pcampo[1] == "d") )
$kfields[] = $pcampo;
else {
$fields[] = $pcampo;
$tipos[] = $ptipo;
}
}
}
}
?>
-7
DuiMDog
16 年前
在 2007 年 4 月 11 日,admin 在 mihalism dot com 上发布了一个“易于使用的 MySql 类”。
我认为 get_affected_rows 函数中存在一个错误。它引用了查询 ID,但应该引用连接 ID。

更正后的函数应该是
function get_affected_rows($connect_id = ""){
if($connect_id == NULL){
$return = mysql_affected_rows($this->connect_id);
}else{
$return = mysql_affected_rows($connect_id);
}
if(!$return){
$this->error();
}else{
return $return;
}
}
To Top