PHP mysqli_connect和数据库连接没有全局变量,如何使其干净可靠?

时间:2014-03-28 01:12:08

标签: php mysqli global-variables

我会引用问题的部分来简化我引用的内容,我是非传统的PHP开发人员,所以在编辑之前询问为什么你告诉我什么,即使它有效也无法理解代码。

上半场

第1.1部分 <我的主要问题就是这样:如何将分配给mysqli_connect()的非全局变量可靠地保持可访问?

第1.2部分:为问题增加了一些复杂性:我为AJAX和非AJAX请求以及&#34; dirty&#34;访问同一个文件。 part是不断需要检查非全局变量isset()

传统非AJAX请求的结构如下所示......

PHP Includes Structure

第1.3部分:目前我已将mysqli_connect()分配给一个全局变量,我一直读到这个变量显然是纯粹的邪恶。据我所知,整个全局与(什么是非全局,本地?)位在基本术语中只能暴露部分服务器代码,以便其他人可以将PHP与您自己构建的自定义API一起使用(如果不是,那么尝试用为什么一个人会这样做)用一句话来解释它。我没有计划以这种方式创建任何API,但仍希望在有限范围中更好地理解这个主题,因为只有直接适用于此问题的内容才能作为未来的基础。< / p>


这是我的数据库连接文件的精简版;我已添加评论以澄清正在发生的事情。虽然我显然希望改进我的做法,但我并不打算做出任何超级狂野的改变......

<?php
//This file included by the main PHP file.

if ($_SERVER['HTTP_HOST']!='localhost' && substr($_SERVER['HTTP_HOST'],0,7)!='192.168')
{// LIVE domain
 $p0 = explode('www.',$_SERVER['HTTP_HOST'],2);
 $domain = $p0[1];
}
else
{// Local or network access
 $p0 = explode('www.',$_SERVER['REQUEST_URI'],2);
 $p1 = explode('/',$p0[1],2);
 $domain = $p1[0];
}

if (!isset($_SESSION['user_status']) || $_SESSION['user_status']<8)
{//Common VERY limited SQL syntax access only.
 $GLOBALS['connection'] = mysqli_connect($vars['db_host'],$vars['db_user'],$vars['db_pass'],$vars['db_db']);
}
else
{//Admin SQL syntax access
 $GLOBALS['connection'] = mysqli_connect($vars['db_host'],$vars['db_user_admin'],$vars['db_pass_admin'],$vars['db_db']);
}    

if ($GLOBALS['connection'])
{
 if (!isset($_SESSION)) {include('sessions.php');}
 $_SESSION['database'] = 1;

 $dbs = true;//structure leftover from 'mysql' to 'mysqli' API switch.

 if ($dbs)
 {//Timezone, etc...
  $query1 = "SET time_zone = '+00:00';";
  $result1 = mysqli_query($GLOBALS['connection'],$query1);

  if ($result1) {}
  else {mysqli_error_report($query1,mysqli_error($GLOBALS['connection']),__FUNCTION__);}
 }
}
?>

所以目前的查询往往看起来像这样......

$result1 = mysqli_query($GLOBALS['connection'],$query1);

下半场

第2.1部分经过一些阅读后,似乎用于处理mysqli_connect()方法是在程序中处理变量 MySQL查询日志清楚地看到它),我宁愿分配一次而不必重新连接数据库七次em>启用)。我经常遇到连接已经存在的问题(这个问题的肮脏方面)会产生冲突。即使我利用类,我也必须手动将它们作为参数传递给显然太过深层的函数。通过PHP包括在全球范围内简单地看到。所以我希望确保我可以拥有一个标准的 include(),它可以在网站上干净利落地工作,无论它是否是一个AJAX请求。

第2.2部分以另一种方式,如果我们假设程序方式使用mysqli_connect()强制PHP重新连接到数据库的非全局变量,例如,针对单个页面请求的所有七个MySQL查询?

第2.3部分简单地说,将mysqli_connect()分配给(变量,类,对象......以及它的范围是什么)是最好的事情?

第2.4部分简单地说明将{em>文件包含在mysqli_connect()所在的最佳方式(对于整个网站)以获取更多其他情况,例如: AJAX请求?

我很乐意根据需要澄清/编辑。

1 个答案:

答案 0 :(得分:0)

  

如何使分配给mysqli_connect()的变量非全局但可以可靠地清除?

这个很简单。
如果你的应用程序架构一直在使用OOP,那么只要不需要 - 当你需要这个变量时,它就会一直准备就绪你肯定不需要原始的mysqli对象了

如果您使用旧的简单程序PHP编写 - 只需将其设为全局。

  

我为AJAX和非AJAX请求访问相同的文件

这个与db问题根本没有关系。
学习使用模板(或更好的MVC分离),你会发现你可以使用完全相同的代码来提供任何请求。

  

只能暴露部分服务器代码,以便其他人可以使用PHP

这个是错的。
原因不同。

  

简单地说明将mysqli_connect()分配给

是最好的事情

事实上,你关心的是最微不足道的事情。虽然不关注真实的。

你真正的问题是使用准备好的陈述。如果您计划将mysqli_query与原始SQL查询完全相同,那么就像使用旧的mysql_query一样 - 那么没有一个理由继续前进 - 只需保留旧的mysql_query即可。就如此容易。