我在开发过程中遇到两个版本的PHP之间存在以下情况。我暂时做了以下几点:
$oldphp = getdbVersion();
if($oldphp)
{
$result = mysql_query($sql) or die(mysql_error());
}
else
{
$result = mysqli_query($conn, $sql) or die(mysql_error());
}
无论如何都要覆盖这些函数,以便您可以调用新名称,但会自动调用旧名称,因此代码只有:
mysqli_query ($sql);
但会根据服务器版本看到正确的功能吗?
我最终使用了一个包装器,所以代码检查不需要遍布整个地方来检查函数是否存在:
function _mysql_query($connection, $findrecords)
{
if(check_sql_version())
{
$result = mysql_query($findrecords);
}
else
{
$result = mysqli_query($connection, $findrecords);
}
if( ! $result)
{
die('Invalid query: ' . (check_sql_version())? mysql_error():mysqli_error());
}
return $result;
}
答案 0 :(得分:0)
Appaprently you can override PHP built-in functions(使用APD extension),但是当你想要做的事情时,你应该有一个很好的用例。问题中的一个是不一个这样的案例。
如果您需要同时支持mysql和mysqli扩展,那么您应该使用一组类和适配器来抽象数据库交互,其中每个适配器实现用于与数据库交互的公共接口。有许多数据库抽象库可供使用,您可能会找到一个满足系统要求的库,同时仍然通过mysql和mysqli扩展提供访问方法。
ADODB是经典之作。作为一个遗留库本身,它很可能适用于您必须支持的旧版PHP,同时仍然可以使用mysqli扩展。文档在这里:
答案 1 :(得分:0)
您需要为所有功能定义包装器,这是一个很好的示例,说明如何执行此操作here。在这种情况下,它提供了向后兼容性,如果您希望在较新版本的PHP中运行许多遗留代码,这将非常有用。但是你的情况正好相反。你应该开发使用mysqli配置前向可比性垫片。
要调用(前进)垫片,只需...
if(!function_exists('mysqli_connect')) {
require_once 'mysqli.inc,.php';
}
但是我并不知道mysqli现有的前向垫片。