我已经搜索过网络,到目前为止,我看到的是可以同时使用mysql_和mysqli_的含义:
$con=mysqli_connect("localhost","root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
echo"failed to connect";
}else{
echo"connected";
}
mysql_close($con);
echo"Done";
?>
要么
$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...))
mysql已被弃用,这只意味着它们不会一起工作。你为什么要这样做..?
您应该避免完全使用mysql_*函数。它们容易出错且不安全,它们将很快从PHP中删除(目前已被标记为已弃用)。 [这个好答案] [0]进一步详细说明了它们为什么不好。 [0]:stackoverflow.com/a/12860046/1055295
1)您坚持使用旧的伪劣界面(mysql),从eons开始就在文档中将其标记为过时。2)出于某种奇怪的原因,您想将其与后继者混合使用,而不是做对的事情并转换为新的界面3 )您很惊讶,它无法正常工作,以至于您询问有关它的信息,尽管您所做的事情显然是胡说八道。
mysql_fetch_array()的可能重复项期望参数1为资源,在select中给出布尔值
还有另一种迷信将被添加到成千上万的迷信中。每个人都可以确定其诚实的功能是"容易出错的",而不是程序员,因为程序员不知道如何正确使用功能,并且几乎不会对新功能有这种想法。
这不是迷信。当然,您可以使用mysqli_*函数编写错误的代码,而使用mysql_*函数编写好的代码。但是后一类由于其功能较差而被标记为已弃用,无法支持OO风格的调用甚至是准备好的语句(仅举两个示例)。如果可以选择两种工具来完成相同的工作,那么从长远来看,其中一种显然更好,并且更灵活,正确答案是否显而易见?
在PHP中,有一个无法支持OO风格的调用的函数,没人会弃用。他们怎么了?
那不是我要强调的重点。缺乏准备好的报表支持和交易是最大的问题。
不乏交易。您是否真的相信所有这些年PHP用户都无法使用事务?你能证明这个吗?
没有直接支持,例如mysqli::begin_transaction。您所能做的就是mysql_query("START TRANSACTION")。这使错误处理变得更加麻烦,而mysqli变体在事务期间出现问题时会引发异常。这使代码更加清晰易读。可以说,您可以使用自定义类和mysql_*调用来模拟此功能,但这有点矫over过正,因为它只能手动实现mysqli_*。
您是否真的认为必须在应用程序代码中以原始API调用的形式直接使用mysqli API,而无需封装自定义类?看着最近的问题,看到这种方法我很痛苦。您是否真的认为必须以这种方式使用mysqli?
当然不是。但是,鉴于可以在不赞成使用的功能和积极支持的功能之间进行选择,例如滚动自己的抽象,为什么要使用旧功能?
为什么使用是另一个问题(尽管我对选择不满意)。但是我在问为什么旧的mysql ext是"容易出错"和"不安全"的。而且您没有提供证明,向我提供了纯属虚假(不支持交易等)或无关紧要的(程序样式)的东西。但是事实是,老的mysql ext不会给用户带来任何问题。这些用户仅更改他们使用的功能名称就不会有任何好处。
是的,我从一开始就承认-`这不是迷信。当然,您可以使用mysqli_ *函数编写错误的代码,而使用mysql_ *函数编写好的代码。 `。由于容易出错,我主要是指缺少准备好的语句。当然,您可以在将数据连接到查询之前对数据进行转义,但是很容易忘记字段,从而引入了漏洞。使用准备好的语句,这是不可能的。再说一次,这与程序员而不是工具有更多关系,所以就像你说的那样,程序员才是最重要的。
在我们同意必须以任何一种方式使用的自定义类中,一个人可以使用模拟的准备好的语句-可以在链接到的那个人旁边的答案中看到一个示例。因此,API再次没有问题。说旧的mysql ext容易出错并且不安全只是迷信。或者-如果您喜欢这种方式-一个可怕的故事,旨在为弃用辩解。但是mysql ext本身并没有错,而且从来没有错。唯一的问题是,非常PHP的用户,除了无法使用应用程序代码中的原始API调用外,什么也无法使用。
我现在被你的论点说服了。你显然比我有更多的经验。但是,为什么mysql_*扩展名被标记为已弃用?
据我所知,只有负责扩展支持的人员决定放弃它。 PHP团队不仅是支持各种扩展的人。说,微软负责Windows支持。他们从最近的5.5版本开始不再支持XP。 mysql同样适用-维护扩展的Oracle员工决定删除它。就这么简单。但是我怀疑这个意图在很大程度上受到了社区的支持,因为我们在这里讨论了同样的错误信念。
@AndreiBrsan,这应该有所启发:wiki.php.net/rfc/mysql_deprecation
我懂了。谢谢提供信息。好吧,我想异步查询对于高性能Web应用程序可能是另一件事。不过,我还没有提到它们,因为到目前为止我还没有亲自使用它们。
不,您不能同时使用mysql和mysqli。它们是独立的API,它们创建的资源彼此不兼容。
但是,有一个mysqli_close。
尽管您永远都不需要关闭连接;当不再在任何地方引用对象时,它们会自行清理。 (不确定普通的旧资源是否可以这样做,但是对象实际上可以在不显着的程度上利用RAII的优势。)
@cHao不仅如此,而且在脚本退出时,PHP将关闭所有打开的MySQL连接
但根据我的经验,并非总是如此,因此我们总是在文件的底部放置一个结束符。
这里仅给出关于所有三个MYSQL API的一般答案,并提供参考:
您不能将来自PHP的三个(mysql_*,mysqli_*,PDO)MYSQL API中的任何一个混合在一起,但这是行不通的。甚至在手动常见问题解答中:
It is not possible to mix the extensions. So, for example, passing a mysqli connection to PDO_MySQL or ext/mysql will not work.
从连接到查询,您需要使用相同的MySQL API及其相关功能。
http://php.net/manual/zh/mysqlinfo.api.choosing.php
今天有人试图告诉我,将mysql_real_escape_string()与其余代码作为PDO混合时,他们没有问题/错误。在使用这些不同的API时,有什么我没来的吗?我是一个无知的人吗?这是针对"现在已删除"的问题stackoverflow.com/q/34209127,只有10K +的会员才能看到,任何人都想知道。与$stmt3->execute(array(classID => $_POST[class],studentID => mysql_real_escape_string($substr)))有关-我在这里错过了什么吗?
@ Fred-ii-您是正确的:)阅读手册表明您正确。可能发生的情况是mysql_real_escape_string()会默默尝试使用默认参数进行连接,然后将这些参数用于OP。因此,它只是建立了连接以获得字符集。所以OP有2个连接
如果OP至少告诉我/我们他们可能有2个单独的连接,则ID可能同意;他们决定不这样做。但是,我仍然看不到那将如何工作。如果是这样,我很困惑。
@ Fred-ii-参见:link_identifier它将使用默认的连接设置,该设置是通过ini_get()获得的。因此,它可能仅适用于具有默认设置的OP。我就离开,拿些新咖啡(???)。
您可能想添加有关sqlsrv_query()的信息。我刚刚在这里关闭了一个问题stackoverflow.com/q/41263771
@FunkFortyNiner正确,mysql_real_escape_string绝对不应与PDO混合使用,如果这样做,则很可能会发生SQL注入漏洞和错误地转义的字符串。也就是说,mysql_real_escape_string()的PDO版本称为PDO::quote(),但警告:quote()在字符串周围添加引号,mysql_real_escape_string则不会,因此$str="".mysql_real_escape_string($str)."";会转换为$str=$pdo->quote($str);,而不是$str="".$pdo->quote($str)."";移植时假设。
从技术上讲,您可以根据需要使用任意数量的独立连接,而问题仅是由拼写错误引起的-您只能将一个扩展中的资源与另一个扩展中的功能一起使用,这是显而易见的。
但是,无论是单个API还是其他API,都应避免来自同一脚本的多个连接。因为它将给数据库服务器增加负担,并耗尽其资源。因此,尽管从技术上讲可以,但不要在代码中混合使用不同的扩展名,除非有短暂的重构时间。
尽管这可能是一个好主意,但是出于这个原因开发了连接池。当有多个Web请求命中Web服务器时,您将无法轻松使用同一连接,因此您需要打开一个新连接。连接池节省了应用服务器和数据库的开销。
mysqli比现在已不建议使用的mysql安全得多。这就是为什么您应该坚持使用mysqli的原因,也不能将它们混合使用,因为它们都是不同的。