我可以在PHP中混合使用MySQL API吗?


106

我已经搜查了网,到目前为止,我所看到的是,你可以使用mysql_mysqli_共同意思是:

<?php
$con=mysqli_connect("localhost", "root" ,"" ,"mysql");

if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysql_close($con);
echo "Done";
?>

要么

<?php
$con=mysql_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysqli_close($con);
echo "Done";
?>

是有效的,但是当我使用此代码时,我得到的是:

Connected
Warning: mysql_close() expects parameter 1 to be resource, object given in D:\************.php on line 9
Done

对于第一个,除了与相同mysqli_close()。对于第二个。

问题是什么?我不能使用mysql_mysqli在一起?还是正常?是我可以检查连接是否全部有效的方法吗?(if(mysq...)


5
mysql已被弃用,这只能说明它们不能一起工作。你为什么要这样做..?
Sterling Archer

7
您应该避免mysql_*完全使用函数。它们容易出错且不安全,它们将很快从PHP中删除(目前被标记为已弃用)。[这个好答案] [0]进一步详细解释它们为什么不好。[0]:stackoverflow.com/a/12860046/1055295
AndreiBârsan'13年

2
1)您坚持使用旧的伪劣界面(mysql),该版本从eons开始就在文档中被标记为过时。2)出于某种奇怪的原因,您想将其与后继者混合使用,而不是做对的事情并转换为新的界面3 )您很惊讶,无法对它进行询问,尽管很明显您所做的事情是胡说八道。
2013年

1
这不是迷信。当然,您可以使用mysqli_*函数编写不好的代码,而使用函数编写好的代码mysql_*。但是后一类被标记为已弃用,因为它是一组较差的功能,不能支持OO风格的调用甚至是准备好的语句(仅举两个示例)。如果可以选择两种工具来完成相同的工作,那么从长远来看,其中一种显然更好并且更灵活,正确的答案不是很明显吗?
AndreiBârsan13年

1
当然不是。但是,考虑到可以在不赞成使用的功能和积极支持的功能之间进行选择,例如滚动自己的抽象,为什么要使用旧功能?
安德烈Bârsan

Answers:


65

不,你不能使用mysqlmysqli在一起。它们是独立的API,它们创建的资源彼此不兼容。

mysqli_close虽然有一个。


尽管您永远都不需要关闭连接;当不再在任何地方引用它们时,对象会自行清理。(不确定普通的旧资源是否可以这样做,但是对象实际上可以在不显着的程度上利用RAII的优势。)
cHao 2013年

@cHao不仅如此,而且在脚本退出时PHP将关闭所有打开的MySQL连接
爆炸药

1
但是根据我的经验,并非总是如此,因此我们总是在文件的底部放置一个结束符。
RationalRabbit

14

这里仅给出关于所有三个MYSQL API的一般答案,并提供参考:

不能混合任何三(中mysql_*mysqli_*PDO从PHP一起)MYSQL API的,它只是不工作。甚至在手册FAQ中

这是不可能的混合扩展。因此,例如,将mysqli连接传递到PDO_MySQL或ext / mysql 将不起作用


从连接到查询,您需要使用相同的MySQL API及其相关功能。


今天有人试图告诉我,mysql_real_escape_string()与其他代码作为PDO 混合使用时,他们没有问题。在使用这些不同的API时,有什么我没来的吗?我是一个无知的人吗?这是针对“现在已删除”的问题stackoverflow.com/q/34209127,只有任何人想知道的情况,只有10K +成员才能查看。这与$stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))-我在这里错过了什么吗?
Funk Forty Niner 2015年

1
@ Fred-ii-您是正确的:)阅读手册表明您正确。可能发生的情况是,mysql_real_escape_string()它将默默尝试使用默认参数建立连接,然后将这些默认参数用于OP。因此,它只是建立了连接以获得字符集。所以OP有2个连接
Rizier123

如果OP至少告诉我/我们他们可能有2个独立的连接,我可能会同意;他们决定不这样做。但是,我仍然看不到那将如何工作。如果是这样,我很困惑。
Funk 40 Niner,2015年

@ Fred-ii-参见:link_identifier它将使用默认的连接设置ini_get()。因此,它可能仅适用于具有默认设置的OP。我就离开,拿些新咖啡(☕☕☕)。
Rizier123

您可能想添加有关的信息sqlsrv_query()。我刚刚在这里关闭了一个问题stackoverflow.com/q/41263771
Funk Forty Niner,2016年

2

从技术上讲,您可以使用任意数量的独立连接,而问题仅是由拼写错误引起的-您只能将一个扩展中的资源与另一个扩展中的功能一起使用,这是显而易见的。

但是,无论是单个API还是其他API ,都应避免来自同一脚本的多个连接。因为它将给数据库服务器增加负担,并耗尽其资源。因此,尽管从技术上讲可以,但不要在代码中混合使用不同的扩展名,除非有短暂的重构时间。


尽管这可能是一个好主意,但是出于这个原因开发了连接池。当有多个Web请求命中Web服务器时,您将无法轻松使用同一连接,因此您需要打开一个新连接。连接池节省了应用服务器和数据库的开销。
道格

-3

MySQLiMySQL现在不推荐使用的安全性高得多。这就是为什么您应该坚持MySQLi并且也不能将它们混合使用,因为它们都是不同的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.