PHP Conference Japan 2024

MySQL 函数

注释

注意:

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

目录

添加注释

用户贡献的注释 37 条注释

arnold_dba
17 年前
此外,为了保护 MySQL 数据并能够符合 PCI 标准,您应该加密数据。有很多方法可以做到这一点。对于黑客,您可以使用 dm-crypt (www.saout.de/misc/dm-crypt) 工具。它基本上用于加密整个分区。如果您想要一个复杂的解决方案,请使用 Packet General 的 MySQL Security-GENERAL (www.packetgeneral.com)
在 Windows 上,您可以使用 Windows 自身提供的磁盘加密功能或诸如 Truecrypt (www.truecrypt.org) 之类的工具。
matiyahoo-publico at yhoo dot com dot ar
17 年前
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*]'";
php comments of fuzzyworm co., uk
18 年前
如果您希望 PHP 与 MySQL 很好地配合使用,即使是在基于 Windows 的系统下的 Apache 下,也可以尝试使用 Apache Friends 的 XAMPP。它可以节省配置文件的麻烦,这是尝试使这三个在 Windows 下一起工作时唯一的主要问题。

http://www.apachefriends.org/en/xampp-windows.html
Microsoul V3
19 年前
我使用 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 根目录读取配置文件。这样,一些用户可能遇到的 MySQL 条目就会显示在你的 phpinfo 中。无需进行注册表设置或复制任何内容。此外,请参考用户评论中提供的其他优秀的帮助信息。以下是我采取的简化步骤:
我在“程序文件”上级文件夹树中创建了一个名为“PHP”的文件夹(浏览你的电脑)。我将 .zip 格式的 PHP 版本解压到该文件夹中(不是自动安装版本)。我编辑了 php.ini-recommended 文件,将其重命名为 php,添加了我的 SQL 用户名、数据库名称等(你真的需要仔细查看配置文件,确保没有遗漏任何内容)。启用了 extension=php_mysql.dll 扩展(只需删除其前面的分号)。将 PHP 文件夹添加到 PATH 环境变量中(关于如何执行此操作的说明非常简单,并且在上面有文档)。我还将 ext 文件夹添加到 PATH 中,但不确定是否真的必要。用户评论对我帮助很大,因此我想回馈社区,并尝试更深入地探讨这个主题。
[email protected]
19 年前
客户端不支持服务器请求的身份验证协议;请考虑升级 MySQL 客户端

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

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

要了解你正在使用哪个 mysql-client 版本,请尝试使用 phpinfo() 函数。
[email protected]
19 年前
John Coggeshall 为仍然使用旧的 ext/mysql 函数的应用程序编写了一个 PHP5 ext/mysqli 兼容性脚本。这避免了在 PHP5 中加载 mysql 和 mysqli 扩展的麻烦,这可能很棘手。

该脚本位于:
http://www.coggeshall.org/oss/mysql2i/
[email protected]
16 年前
<?php
# 由 dhirendra 创建,可通过 [email protected] 联系
# 此脚本用于检查两个表之间的数据差异
# 当两个表的结构相同时的。
# 限制:
# 1) 两个表的结构必须相同。
# 2) 两个表的名字必须不同,但如果相同,则显然
# 第二个表应该在不同的数据库中。
# 3) 如果使用两个数据库,则两个数据库的权限应相同
# 因为我正在使用别名来获取信息。
#
# 用途:
# 1) 当你在现有的脚本中进行了一些更改并且期望得到特定的输出时,这可能很有用。因此,借助此
# 函数,你可以比较由于你在脚本中进行的更改而产生的影响。
#
#

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

# 与 MySQL 建立连接
$dblink = @mysql_connect($host,$user,$pass);

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

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

$table2="< your 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);

?>
[email protected]
17 年前
@Amanda 2007年10月12日 09:58

我几乎不得不问问自己这是否是一个真实的问题……如果 MySQL 服务器拒绝连接尝试,那么,是的,MySQL 将能够向 PHP 发送错误……如果 PHP 完全无法访问目标 MySQL 服务器,那么它也足够智能地自行发出相应的错误……
[email protected]
19 年前
关于资源的说明

当资源(例如链接标识符)超出作用域时,它将被删除,并且关联的计算机资源(例如到数据库的 tcp 链接)也将被终止。到目前为止,一切都很好!
但是,在以下代码中,tcp mysql 链接会一直持续到执行结束
<?php
$conn
= mysql_connect('hostname', 'username','password');
$conn = null;
sleep (30);
?>
这是因为在内部保存了链接标识符,以便后续的 mysql 函数能够正常工作。似乎无法删除此内部引用。
但是,如果你要打开 2 个连接,则最旧的连接将自动删除(因此,到 hostname 的连接将在 $conn=null 语句处终止,到 hostname2 的连接将一直存在到脚本结束)。
<?php
$conn
= mysql_connect('主机名', '用户名','密码');
$conn2 = mysql_connect('主机名2', '用户名','密码');
$conn = null;
$conn2 = null;
sleep (30);
?>
skelley at diff dot nl
23年前
您好,以下是一个在3.23版本之前的MySQL数据库中,从表中随机选择记录的小技巧

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

[编辑注:3.23版本之后,只需使用 "SELECT * FROM foo ORDER BY RAND()" 即可]
atk2 at hotmail dot com
17 年前
在终于成功地在新的Windows XP机器上安装了IIS、PHP和MySQL之后,我决定记录下我采取的步骤,以便您可以了解它是如何完成的:http://www.atksolutions.com/articles/install_php_mysql_iis.html

希望对您有所帮助。
richard at NOSPAM dot dimax dot com
18 年前
回复Conrad Decker下面的帖子

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

mysqldump以字母顺序转储表数据,而不是外键约束所需的逻辑顺序。
vbolshov at rbc dot ru
18 年前
我最近在配置与MySQL相关的PHP扩展(即mysql和pdo_mysql)时遇到了问题。后来我发现这不是PHP问题,而是MySQL问题 - libmysqlclient没有随二进制下载提供。我从源代码构建了MySQL,然后两个扩展都成功编译了。
yp
18 年前
在使用Fedora Core Linux Mysql rpm安装时。
按照以下步骤配置以加载mysql头文件。
./configure --with-mysql=/usr/
请记住,在编译之前执行make clean以删除旧的配置
avis_del at yahoo dot com
19 年前
我同意j at jonathany.com的观点

PHP 5.04连接MySQL,
windows安装程序(.msi)中找不到php_mysql.dll
只需从.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
noel at nettensity dot com
19 年前
在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的交互后,请务必更正这些设置!不要在生产机器上保留这些设置。

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

在IIS中,打开Web服务扩展,单击“添加新的Web服务扩展...”
为扩展名键入PHP
在必需文件下
添加[您的php路径]\php5isapi.dll
添加[您的php路径]\php5ts.dll
单击“应用”,然后单击“确定”

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

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

希望对您有所帮助!
匿名
19 年前
如果您在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中使其工作的所有步骤。这只是说明的补充。
Protik Mukherjee
19 年前
Fedora mysql问题!!
在Fedora 3中,php mysql模块不随默认安装一起提供。要安装它,请使用$>yum install php_mysql
如果不执行此操作,您将收到mysql函数(如mysql_connect())的错误。

希望对您有所帮助!
nleippe at integr8ted dot com
20年前
trace_mode会破坏SQL_CALC_FOUND_ROWS。
这是因为它在单独发送<query>之前发出EXPLAIN <query>,因此后续的SELECT FOUND_ROWS()不再是下一个连续的查询,结果为零。
至少对于MySQL 4.0.21和4.1.5gamma,这对我是正确的。
(PHP 4.3.9)
aidan at php dot net
20年前
如果您想复制`mysql --html`的输出,以HTML表格形式打印结果,请参阅此函数

http://aidanlister.com/repos/v/function.mysql_draw_table.php
irn-bru at gmx dot de
20年前
请注意,sql.safe_mode配置设置会影响所有mysql_*函数。这与php安全模式无关,请检查php.ini中的[SQL]部分。

我发现,如果将sql.safe_mode设置为On,mysql_connect将忽略提供的用户名和密码,并使用脚本所有者代替(在debian上检查)。

Brian
mijnpc at xs4all dot nl
22年前
如果您有一台运行Web服务器和PHP的Windows机器,则无需安装MySQL服务器即可在本地测试脚本,如果您被授予建立到远程Web服务器的安全Telnet连接(端口22)。

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

使用用户名和密码连接到远程服务器
最小化shell,就是这样...

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

根据您的远程服务器,您可能会在xx分钟后出现shell超时,只需重新连接或偶尔在shell中按Enter键...

一个极好的免费安全Telnet客户端示例是Putty:Putty:http://www.chiark.greenend.org.uk/~sgtatham/putty/

这个“发现”确实为我节省了很多时间,因为我不必一次又一次地将脚本上传到远程服务器,按[保存]就足够了,呵呵(-
Vladimir Kosmala
14年前
这是一个包含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
SID TRIVEDI
17 年前
<?php
/*
在运行 Apache 的 32 位 Windows XP 上安装 MySQL (Community) 服务器

在 Windows 上,推荐的运行 MySQL 的方式是将其安装为 Windows 服务,这样 MySQL 就可以在 Windows 启动和停止时自动启动和停止。作为服务安装的 MySQL 服务器也可以通过命令行命令或使用图形化服务实用程序(如 phpMyAdmin)进行控制。

PHP ---> MySQL 连接器(php_mysql.dll 和 php_mysqli.dll 作为扩展)
MySQL 为 Windows 操作系统提供了 mysql 和 mysqli 扩展,可在 https://dev.mysqlserver.cn/downloads/connector/php/ 上找到,适用于 MySQL 4.1.16 及更高版本、MySQL 5.0.18 和 MySQL 5.1。与在 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("Your Host Name", "MySQL root directory", 'MySQL password, if any');
//$connect = mysql_connect("Host Name or Address - 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();
?>
davesteinb at yahoo dot com
18 年前
我创建了这个函数来减少数据库调用。您可以将 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>
sb at stephenbrooks dot org
18 年前
我正在更换网站托管服务商,我之前的托管服务商提供了一个数据库的“转储”,形式为一系列SQL请求,(我假设)这些请求必须按顺序执行才能在另一个系统上重建数据库。它是使用“MySQL dump 9.11”生成的。查询以分号和换行符结束,而注释行以双连字符开头。下面的脚本打开与SQL服务器的连接,并将此格式的转储文件$file加载到数据库$dest_db中。

函数 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"序列出现在查询内部,这可能不是万无一失的,但我希望它能帮助其他拥有此类转储文件的人。
mw-php at ender dot com
23年前
mysql_fetch_[row|object|array] 函数将数据作为字符串类型返回。由于PHP变量的灵活性,这通常无关紧要,但如果您碰巧从数据库中检索两个整数,然后尝试使用按位运算符进行比较,您将遇到麻烦,因为(19 & 2) == 2,但("19" & "2") == 0。为了解决这个问题,如果您将数据库中的变量与按位运算符一起使用,请使用settype()函数在比较之前显式将变量转换为整数。
Joe Greklek
18 年前
我看到很多新手对扩展程序最初没有安装感到沮丧,所以这里有一个针对 Windows 的快速教程。

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

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

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

您*必须*将 libmysql.dll 和 ext 文件夹的安全权限设置为 IUSR_"MACHINE_NAME" 的读取/读取和执行。例如,我的机器名为 master<acct = IUSR_MASTER>。如果不这样做,您将收到一个 ******.dll - 访问被拒绝。类型的消息。

接下来编辑您的 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 环境变量。希望这对至少一个人有所帮助:)
mbabcock-php at fibrespeed dot net
23年前
由于没有函数可以启动和结束/回滚事务,您必须使用 mysql_query("BEGIN")、mysql_query("COMMIT") 和 mysql_query("ROLLBACK")。这些仅在支持事务的表上才能正常工作。您可能还希望编写自己的 mysql_begin(等)函数,这些函数为您运行上述查询。
joachimb at gmail dot com
16 年前
懒人日志

<?php
/// 如果不存在,则创建一个名为 $table 的表作为 (id, when, message),并在其中插入一行 $message。
/// 如果没有提供连接详细信息,则使用当前的数据库连接。$database 和 $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;
}

?>
mega-squall at caramail dot com
17 年前
对于 Windows 用户,请注意

如果 Apache 作为服务安装,并且您更改了 PATH 变量以使其能够访问 libmysql.dll,则需要重新启动计算机才能应用更改。
nick smith
19 年前
我对这方面还比较陌生,但刚刚设法在 Windows XP 上安装了 Apache 2.0.54、PHP 5.0.4 和 MySQL 4.1.13,还有 phpMyAdmin 2.6.4,也遇到了许多其他人报告的相同问题。在尝试使用 phpmyadmin 并提示我检查 php/mysql 配置之前,我实际上并不知道 PHP 中没有加载 MySQL。

基本上,我只是做了其他人提到的所有操作(将 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.
david at kiwi dot com
17 年前
我想递增用户名,这些用户名应该是字母字符 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*]'";
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);
?>
[email protected]
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 错误</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 错误</b>: 查询为空!';
}
}
//+======================================================+
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);
}
}
//+======================================================+
}

/* 示例 */

$DB = new mysql_db();
$DB->sql_connect('sql_host', 'sql_user', 'sql_password', 'sql_database_name');
$DB->query("SELECT * FROM `members`");
$DB->sql_close();
?>
[email protected]
19 年前
[编辑注:在 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;
}
}
}
}
?>
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')”获得的结果相同。希望您永远不会遇到必须使用此功能的情况,但如果您需要它(就像我一样),它就在这里。
To Top