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

Can I mix MySQL APIs in PHP?

提问人:N3mo 提问时间:7/6/2013 最后编辑:TarynN3mo 更新时间:4/5/2018 访问量:17277

问:

我已经在网上搜索了一下,到目前为止,我看到的是您可以使用和一起的意思: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_mysqliif(mysq...))

php mysql pdo mysqli

评论

7赞 Sterling Archer 7/6/2013
MySQL已被弃用,它们不能一起工作是有道理的。你为什么要这样做..?
2赞 fvu 7/6/2013
1)您坚持使用旧的劣质接口(MySQL),该接口自亿万年以来在文档中被标记为过时 2)出于某种奇怪的原因,您想将其与其继任者混合使用,而不是做正确的事情并转换为新的3)您非常惊讶它不起作用,以至于您在SO上询问它, 虽然很明显你正在做的事情是无稽之谈。
9赞 Andrei Bârsan 7/6/2013
应完全避免使用函数。它们容易出错且不安全,它们很快就会从 PHP 中删除(它们目前被标记为已弃用)。[这个伟大的答案][0] 更详细地解释了为什么它们是坏的。[0]:stackoverflow.com/a/12860046/1055295mysql_*
2赞 Andrei Bârsan 7/6/2013
这不是迷信。当然,你可以用函数写出坏代码,用函数写好代码。但后一类被标记为已弃用,因为它是较差的函数集,无法支持 OO 样式的调用,甚至不支持预处理语句(仅举两个例子)。如果可以选择两种工具来完成相同的工作,从长远来看,其中一种显然更好,更灵活,正确答案不是很明显吗?mysqli_*mysql_*
1赞 Andrei Bârsan 7/6/2013
当然不是。但是,如果可以选择在已弃用的功能和积极支持的功能之间进行选择,例如,滚动自己的抽象,为什么要使用旧函数呢?

答:

73赞 Explosion Pills 7/6/2013 #1

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

不过,有一个。mysqli_close

评论

0赞 cHao 7/6/2013
尽管无论如何您都不需要关闭连接;当对象不再在任何地方被引用时,它们会自行清理。(不确定普通的旧资源是否能做到这一点,但对象实际上可以在不小的程度上利用 RAII。
0赞 Explosion Pills 7/6/2013
不仅如此,@cHao,当脚本退出时,PHP将关闭任何打开的MySQL连接
1赞 RationalRabbit 1/1/2018
但根据我的经验,并非总是如此,所以我们总是在文件底部放置一个关闭。
-3赞 user2555269 7/6/2013 #2

MySQLi比现在弃用的要安全得多。这就是为什么你应该坚持下去,而且你不能把它们混在一起,因为它们都是不同的。MySQLMySQLi

17赞 Rizier123 7/9/2015 #3

只是为了在这里给出关于所有三个 MYSQL API 的一般答案,并附上参考:

您不能将 PHP 中的三个(mysql_*、mysqli_*PDO)MYSQL API 中的任何一个混合在一起,它只是不起作用。它甚至在手册常见问题解答中:

无法混合使用扩展。因此,例如,将 mysqli 连接传递给 PDO_MySQL 或 ext/mysql 将不起作用


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

评论

0赞 Funk Forty Niner 12/11/2015
今天有人试图告诉我,他们在与其余代码是 PDO 混合时没有问题/错误。在使用这些不同的 API 时,我有什么没有得到的吗?我是这里的无知者吗?这是针对“现已删除”的问题 stackoverflow.com/q/34209127 如果有人想知道,只有 10K+ 成员才能查看。这与 - 我在这里遗漏了什么吗?mysql_real_escape_string()$stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))
1赞 Rizier123 12/11/2015
@Fred-ii- 你是对的:)阅读手册表明您是对的。可能发生的事情是,mysql_real_escape_string() 将默地尝试与默认参数建立连接,然后该参数适用于 OP。因此,它只是建立了连接以获取字符集。所以 OP 有 2 个连接
0赞 Funk Forty Niner 12/11/2015
如果 OP 至少告诉我/我们他们可能有 2 个独立的连接,我可能会同意;他们另有决定。但是,我仍然看不出这仍然如何工作。如果是这样,我很困惑。
0赞 Rizier123 12/11/2015
@Fred-ii- 请参阅: link_identifier 它将使用默认的连接设置,它通过 .因此,它可能仅适用于默认设置的 OP。我会离开它,去喝点新咖啡(☕☕☕)。ini_get()
0赞 Funk Forty Niner 12/21/2016
您可能想添加一些关于 的内容。我刚刚在这里关闭了一个问题 stackoverflow.com/q/41263771sqlsrv_query()
2赞 Your Common Sense 7/9/2015 #4

从技术上讲,您可以根据需要使用任意数量的单独连接,而您的问题仅仅是由拼写错误引起的 - 您只能将一个扩展中的资源与另一个扩展中的函数一起使用,这很明显。

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

评论

0赞 Doug 7/9/2015
虽然这可能是一个好主意,但连接池就是出于这个原因而开发的。当有多个 Web 请求命中 Web 服务器时,无法轻松使用同一连接,因此请打开一个新连接。连接池可节省应用服务器和数据库的开销。