PHP 中检查库或函数是否可用的方法

随着版本的升高,PHP的功能也越来越完善,可用的扩展库和函数也越来越多,因此,我们写程序时也要考虑版本的兼容问题,同时还要考虑服务器(特别是虚拟主机)是否安装了扩展库。

本文介绍的函数其实是PHP手册上本来就有的,但是由于这些函数独立性较强,查找不易,所以单独介绍一下,方便查阅。

1. 获取所有可用的模块 – get_loaded_extensions

该函数返回所有已经加载的(可用的)模块。

用法:

 
<?php
print_r(get_loaded_extensions());
?>

2. 获取指定模块的可用函数 – get_extension_funcs

该函数返回指定模块所有可用的函数。

传入的参数(模块名称)必须是小写

用法:

 
<?php
print_r(get_extension_funcs("gd"));
?>

3. 获取所有已经定义的函数 – get_defined_functions

该函数返回所有已经定义的函数,包括内置函数和用户自定义函数。

用法:

 
<?php
function myrow($id, $data) 
{
    return "<tr><th>$id</th><td>$data</td></tr>n";
}
 
$arr = get_defined_functions();
 
print_r($arr);
?>

输出:

 
Array
(
    [internal] => Array
        (
            [0] => zend_version
            [1] => func_num_args
            [2] => func_get_arg
            [3] => func_get_args
            [4] => strlen
            [5] => strcmp
            [6] => strncmp
            ...
            [750] => bcscale
            [751] => bccomp
        )
 
    [user] => Array
        (
            [0] => myrow
        )
 
)

其中 $arr["internal"] 是内置函数, $arr["user"] 是用户自定义函数。

4. 检查指定函数是否存在 – function_exists

该函数返回指定函数是否已经定义。

用法:

 
<?php
if (function_exists('imap_open')) {
    echo "IMAP functions are available.<br />n";
} else {
    echo "IMAP functions are not available.<br />n";
}
?>

MySQL 当记录不存在时插入(insert if not exists)

在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,本文介绍的就是这个问题的解决方案。

问题:我创建了一个表来存放客户信息,我知道可以用 insert 语句插入信息到表中,但是怎么样才能保证不会插入重复的记录呢?

答案:可以通过使用 EXISTS 条件句防止插入重复记录。

示例一:插入多条记录

假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:

 
INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

示例一:插入单条记录

 
INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

使用 dual 做表名可以让你在 select 语句后面直接跟上要插入字段的值,即使这些值还不存在当前表中。