1

假设我正在创建一个基本页面,所述页面的文本取决于通过 GET 变量传递给它的内容。

页面顶部有一个标题,如下所示:

<?php 
mysql_connect("stuff", "stuff", "stuff");
mysql_select_db("dbname");
mysql_query("SELECT * FROM table WHERE ID = '{$_GET['url']}'");

//Now we have connected to the SQL database.
?>

假设我继续在那里编码,因此标题文本会根据传递到 URL 的内容而有所不同(但是,这无关紧要,这是我要质疑的下一部分)。

现在让我们说,在页面的下方,有更多的 PHP 代码,但中间也有更多的 HTML 代码。如果我想在第二个 PHP 片段中再次访问数据库,是否必须重新连接到数据库?或者有没有办法确保连接会话保持打开状态,即使它是一个完全不同的<?php ?>区域?如何使我的 SQL 连接在我结束<?php标签时不会被丢弃?

4

2 回答 2

1

来自: http: //php.net/manual/en/function.mysql-connect.php

注意:一旦脚本执行结束,到服务器的链接将关闭,除非它通过显式调用 mysql_close() 提前关闭。

编辑

抱歉,语言错误:)

于 2013-01-27T22:46:25.240 回答
1

让我们一次解决几个问题:-)

  1. 除非您自己明确地这样做,否则不会断开连接。当然,它会在脚本结束时被删除。即使这样,也有一些持久连接连接池技术可以帮助您避免开销。

  2. mysql_*函数系列已被弃用可能很快就会完全停止工作。转移到更强大、更安全的例如PDO 函数会更好。

  3. 当您将_GET参数直接放在 SQL 查询(或其他服务器代码)中而不进行检查/验证时,您会将自己暴露在该参数包含一些令人讨厌的惊喜的危险中。除了XKCD之外,经典示例是如果您检查$_GET['password']对应于 field password。如果您只是将其编码为

    WHERE ...密码='$_GET[密码]'

并且有人在该字段中放置了值

' OR ''=='

SQL 服务器将看到

WHERE ... password = '' OR ''==''

并且由于 ''确实等于 '',因此该查询将返回true - 并且用户将在不知道密码的情况下登录。如果可能的话,这种“ SQL 注入”通常可以调整到允许攻击者被识别为站点管理员的程度,而这一切都需要。这就是为什么您不想“按原样”使用客户端参数的原因。PDO 的准备好的语句也可以提供帮助。

于 2013-01-27T22:58:34.780 回答