这是一道古老的题目
请看代码,数据库关闭指令将关闭哪个连接标识?( )
$link1 =mysql_connect("localhost","root",""); $link2 = mysql_connect("localhost","root",""); mysql_close();
A.$link1
B.$link2
C.全部关闭
D.报错
根据知识储备,mysql_close在未指定连接标识时,是就近原则。
手册上也有说明
mysql_close() closes the non-persistent connection to the MySQL server that's associated with the specified link identifier. If link_identifier isn't specified, the last opened link is used.
所以答案应该是B。
再想想,似乎有哪里漏了,
If a second call is made to mysql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned.
那么两次connect打开的应该是同一个连接标识,那么应该是一起关闭了吧?
所以选C???
没错,我就是闲的蛋疼,要挣扎着纠结这一个将要被淘汰的函数。于是又验证了一下。
$link1 = mysql_connect('localhost','root',''); $link2 = mysql_connect('localhost','root',''); print_r($link1); print_r($link2);//$link1和$link2一样,第二次未创建新连接,返回已经打开的连接标识 mysql_close(); //下面可以正常打test库里表都打印出来 mysql_select_db('test',$link2); $rs = mysql_query('show tables;',$link2); while ($row = mysql_fetch_assoc($rs)) { print_r($row); echo "<br />"; } //这个当然也能 mysql_select_db('test',$link1); $rs = mysql_query('show tables;',$link1); while ($row = mysql_fetch_assoc($rs)) { print_r($row); echo "<br />"; }
没错,mysql_close()谁也没关闭。
实际上,如果把mysql_close();修改为
<code>mysql_close($link1); 或者 mysql_close($link2);</code>
下面$link1,$link2仍然都是有效的
如果真要close,只有这样才好使,
mysql_close($link1); mysql_close($link2);
两个一起close。
这是为什么呢?为什么呢?
回复内容:
这是一道古老的题目
请看代码,数据库关闭指令将关闭哪个连接标识?( )
$link1 =mysql_connect("localhost","root",""); $link2 = mysql_connect("localhost","root",""); mysql_close();
A.$link1
B.$link2
C.全部关闭
D.报错
根据知识储备,mysql_close在未指定连接标识时,是就近原则。
手册上也有说明
mysql_close() closes the non-persistent connection to the MySQL server that's associated with the specified link identifier. If link_identifier isn't specified, the last opened link is used.
所以答案应该是B。
再想想,似乎有哪里漏了,
If a second call is made to mysql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned.
那么两次connect打开的应该是同一个连接标识,那么应该是一起关闭了吧?
所以选C???
没错,我就是闲的蛋疼,要挣扎着纠结这一个将要被淘汰的函数。于是又验证了一下。
$link1 = mysql_connect('localhost','root',''); $link2 = mysql_connect('localhost','root',''); print_r($link1); print_r($link2);//$link1和$link2一样,第二次未创建新连接,返回已经打开的连接标识 mysql_close(); //下面可以正常打test库里表都打印出来 mysql_select_db('test',$link2); $rs = mysql_query('show tables;',$link2); while ($row = mysql_fetch_assoc($rs)) { print_r($row); echo "<br />"; } //这个当然也能 mysql_select_db('test',$link1); $rs = mysql_query('show tables;',$link1); while ($row = mysql_fetch_assoc($rs)) { print_r($row); echo "<br />"; }
没错,mysql_close()谁也没关闭。
实际上,如果把mysql_close();修改为
<code>mysql_close($link1); 或者 mysql_close($link2);</code>
下面$link1,$link2仍然都是有效的
如果真要close,只有这样才好使,
mysql_close($link1); mysql_close($link2);
两个一起close。
这是为什么呢?为什么呢?
楼主的测试很赞,确实如此,mysql_connect返回的肯定是一个引用,如楼主的测试说明该句柄不但有一个变量引用而且还有一个句柄引用(我自己随便命名的),mysql_close的时候释放句柄引用,然后检查该变量的所有句柄引用是不是都被释放了,如果是的话则对该变量进行内存回收处理。例如
<code>$a = 'Hello'; $b = &$a; $c = &$a; unset($a); echo $b . $c; //HelloHello 而不是 null</code>
这个测试代码说明了内存回收关于引用的处理,所以推测mysql_close也是类似的处理,但是与unset的管理目标是不同的(例如unset管理的是内存指针,mysql_close管理的是连接句柄指针?)
不过貌似研究这个已经完全没有价值了,相同的事情在mysqli系列函数上不会发生:
<code><?php $link1 = mysqli_connect('localhost', 'root'); $link2 = mysqli_connect('localhost', 'root'); mysqli_close($link1); print_r(mysqli_get_host_info($link1)); print_r(mysqli_get_host_info($link2));</code></code>
而且php5已经抛弃了mysql系列函数,因此就算是bug或者不良问题也不会被修复了,调用mysql_connect时应该能看到警告信息:该系列函数将会在未来停止使用。
感谢@incNick 回答,已采纳答案。
另外补充一些内容
就算只有有一个连接的情况
$link1 = mysql_connect('localhost','root',''); $result = mysql_close(); var_dump($result); mysql_select_db('test',$link1 ); $rs = mysql_query('show tables;',$link1 ); while ($row = mysql_fetch_assoc($rs)) { print_r($row); echo "<br />"; }
mysql_close()在未指定link_identifier的时候,返回结果是true,
Returns TRUE on success or FALSE on failure.
表示关闭成功,但实际其实也是没有关闭的,依然能依次打印库里的表,该连接可以使用。
所以说有时间手册也挺害人的。
mysqli_close(),在未指定link_identifier的情况下执行结果是false。
在多个连接的情况下,在指定link_identifier的情况下,可单独关闭$link1,$link2。
综上,link_identifier是必需的!!!!
现在不是用pdo,mysqli了么,mysql_connect 之类的不鼓励使用了

phpientifiesauser'ssessionusessessionSessionCookiesAndSessionIds.1)whiwSession_start()被称为,phpgeneratesainiquesesesessionIdStoredInacookInAcookInamedInAcienamedphpsessidontheuser'sbrowser'sbrowser.2)thisIdAllowSphptptpptpptpptpptortoreTessessionDataAfromtheserverMtheserver。

PHP会话的安全可以通过以下措施实现:1.使用session_regenerate_id()在用户登录或重要操作时重新生成会话ID。2.通过HTTPS协议加密传输会话ID。3.使用session_save_path()指定安全目录存储会话数据,并正确设置权限。

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

利用会话构建高效购物车系统的步骤包括:1)理解会话的定义与作用,会话是服务器端的存储机制,用于跨请求维护用户状态;2)实现基本的会话管理,如添加商品到购物车;3)扩展到高级用法,支持商品数量管理和删除;4)优化性能和安全性,通过持久化会话数据和使用安全的会话标识符。

本文讨论了PHP中的crypt()和password_hash()之间的差异,以进行密码哈希,重点介绍其实施,安全性和对现代Web应用程序的适用性。

文章讨论了通过输入验证,输出编码以及使用OWASP ESAPI和HTML净化器之类的工具来防止PHP中的跨站点脚本(XSS)。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版
中文版,非常好用

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)