提问人:N3mo 提问时间:7/6/2013 最后编辑:TarynN3mo 更新时间:4/5/2018 访问量:17277
我可以在 PHP 中混合 MySQL API 吗?
Can I mix MySQL APIs in PHP?
问:
我已经在网上搜索了一下,到目前为止,我看到的是您可以使用和一起的意思: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...)
)
答:
73赞
Explosion Pills
7/6/2013
#1
不,你不能一起使用。它们是单独的 API,它们创建的资源彼此不兼容。mysql
mysqli
不过,有一个。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
比现在弃用的要安全得多。这就是为什么你应该坚持下去,而且你不能把它们混在一起,因为它们都是不同的。MySQL
MySQLi
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 服务器时,无法轻松使用同一连接,因此请打开一个新连接。连接池可节省应用服务器和数据库的开销。
评论
mysql_*
mysqli_*
mysql_*