Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否为每个查询创建新连接?_Php_Mysql - Fatal编程技术网

Php 是否为每个查询创建新连接?

Php 是否为每个查询创建新连接?,php,mysql,Php,Mysql,注意:我用谷歌翻译写了这个 为了使用MySQL,我一直在做以下工作: -> Open Connection to the database. -> see details -> Insert Data -> another query -> close Connection 在关闭之前,我通常使用相同的连接做各种事情。 一位在墨西哥IPN研究此问题的朋友向我提到,正确的方法(为了安全)是为每个查询建立一个新的连接,例如: -> Open Connection

注意:我用谷歌翻译写了这个

为了使用MySQL,我一直在做以下工作:

-> Open Connection to the database.
-> see details
-> Insert Data
-> another query
-> close Connection
在关闭之前,我通常使用相同的连接做各种事情。 一位在墨西哥IPN研究此问题的朋友向我提到,正确的方法(为了安全)是为每个查询建立一个新的连接,例如:

-> Open Connection to the database.
-> see details
-> close Connection
-> Open Connection to the database.
-> Insert Data
-> close Connection
-> Open Connection to the database.
-> another query
-> close Connection
insert into table1(relacion) values([insert into tablaRelacionada(id) values("dato")]);
我的问题是,什么是正确的做法?我的方法是对数据库进行最少的查询,只建立一个连接并保持它,直到它不再为我服务

此外,是否可以对表进行双重插入?例如:

-> Open Connection to the database.
-> see details
-> close Connection
-> Open Connection to the database.
-> Insert Data
-> close Connection
-> Open Connection to the database.
-> another query
-> close Connection
insert into table1(relacion) values([insert into tablaRelacionada(id) values("dato")]);

“relacion”是从“tablaRelacionada”中的第一个查询中插入的ID。

不,不可能用一个
insert
语句将行插入两个不同的表中。(您可以使用触发器来完成,但该触发器需要发出一个单独的
INSERT
语句…从客户端看,它看起来像一条语句,但在服务器上,将执行两条
INSERT
语句


如果不考虑性能和可伸缩性,那么“搅动”连接是可行的。为每个语句创建单独的连接并不一定“错误”,但这是资源密集型的。创建新会话会产生大量开销。(从客户端看,这看起来相当简单,但除了客户端上的代码路径之外,还需要在服务器端进行大量工作。)

重用现有连接是一种常见的模式。实现“连接池”的最大好处之一是,可以轻松地重用连接,而无需“搅动”,重复连接和断开与数据库的连接

就每一条SQL语句的独立连接而言,在某种程度上增加了“安全性”,这有点牵强

但是我可以看到新初始化的会话的一些好处


例如,如果重用现有会话,您可能不知道会话状态中已做了哪些更改。以前所做的任何更改仍然“有效”。这可能是会话变量设置(例如时区、字符集、自动提交、用户定义变量)这可能会对当前语句产生影响。但是在一个脚本中,如果您获得了新的连接,您应该知道已经进行了哪些更改,所以这不应该是一个问题。(如果使用池中的连接,这将是一个更大的问题,因为池中的连接由多个进程共享。一个进程破坏时区或字符集,可能会导致重用该连接的其他进程出现大量问题。)

在每个查询中使用单独的连接充其量只能让应用程序和数据库服务器陷入不必要的开销。我看到这里提到了三个方面:

  • 效率
  • 应用程序安全
  • 网络安全
  • 1.效率 简短的回答:坏主意

    通常,初始化连接所需的开销远远大于运行实际查询所需的开销。如果采用按查询连接的方法,应用程序的运行速度可能会慢几个数量级

    2.应用程序安全 简短回答:一般来说这是个坏主意,但在PHP环境下完全没有必要

    我能想到的唯一“安全”问题是担心用户访问剩余的临时表,或会话设置“出血”结束。除非您使用的是非默认的持久连接,否则这种情况不太可能发生。此外,MySQL中的大多数临时值都存储在每个连接上,并且除非您有一些PHP代码写得很差[以一种特殊、奇怪且很少推荐的方式,即共享DB单例并以奇怪的方式访问它们]然后,如果行星正好对齐,您可能会以意外的方式访问某些特定于MySQL会话的数据

    这与基本相同,不值得担心

    3.网络安全 简短回答:不。什么?只是……不

    如果你担心有人偷看你的连接,解决办法不是让他们更多,而是让他们更安全。所以如果你担心的话,就用这个

    TL;DR否。不要为每个查询创建单独的连接。不好。告诉你这件事的人需要回到学校


    多表插入 您所引用的内容是不可能的,您可能希望按照以下思路进行操作:

    $dbh->query("INSERT tablaRelacionada(id) values('dato')");
    $lastid = $dbh->lastInsertId();
    $dbh->query("INSERT INTO table1(relacion) values($lastid);");
    
    假设表
    tablaRelacionada
    有一个自动递增列,这是您试图从第一个查询中获得的


    请参阅:

    只要您需要1次或10次查询,就应该保持相同的连接处于打开状态。对于插入到表1中的
    则为否…
    @dub stylee:“当您通过Internet时,最好每次打开一个新连接。”---为什么?你意识到这会带来巨大的开销吗?如果我在另一个地方有一个MySQL,我首先要研究的是在两者之间建立一条安全的通信线路,例如通过使用OpenVPN和no,你朋友所说的神话在安全性方面对你没有任何帮助。安全性是通过正确地确保你拥有东西配置得很好,是最新的,只有必要的渠道向公众开放,这只是冰山一角。也许它在翻译中丢失了,但“你的朋友”是个白痴。@PeeHaa:太好了,我们这里有一个人可以这么直接;-)当然,我必须回到它,谢谢你的回复,我完全冷静了。另外,如果你的MySQL服务器不在同一个IDC或服务器中,并且需要使用这些服务器,那么使用VPN和限制IP以防止外部访问是一个好的选择。@Jorhel Reyes:我补充了一个关于多表插入器语法的问题的答案t在MySQL中,这是不可能的。