2013-05-03 189 views
-1

关于SQL语句,我们使用的SQL语句很容易在我正在工作的这家公司工作(他们都是计算机程序员,没有很多Web体验),我试图让他们和我自己去转向使用准备好的语句。我已经阅读了很多,但还是有点不清楚。例如,我们使用include(/mnt/configdb.php),然后是db_connect();在我们的PHP文件中使用SQL(而不是SQLi)通过ini文件连接到每个SQL DB。我希望使用更好的方法/语句,也许mysqli_connect(),当我们需要更改服务器和更新SQL信息(在服务器移动的情况下)时,这些方法/语句将会很灵活。任何想法最好的工作? mysqli_connect()与mysql_connect或使用函数调用连接到服务器上的ini文件,就像我已经做的那样?通过PHP文件连接到SQL DB的最佳方式?

例如,我想设置它以便创建一个connect.php文件,并且它对于每个需要访问的模式都有多个数据库连接,然后我只在必要时包含该文件和sqli语句PHP文件将所有变量发送到需要连接的SQL DB。什么是最好的方式去做这件事,或者我该如何将已经有的东西(下面)转换成sqli和准备好的陈述?我应该甚至使用SQLi?或者只是坚持SQL?

configdb服务器上:用于将数据上传到SQL数据库

function db_connect() 
{ 
global $dblink, $dbhost, $dbuser, $dbpass, $dbname; 
$dblink = @mysql_connect($dbhost, $dbuser, $dbpass) or die ('DB ERROR - Could not connect: '.mysql_error()); 
@mysql_select_db($dbname) or die ('DB Error - Could not select: '.mysql_error()); 
} 
function close_db() 
{ 
global $dblink; 
@mysql_close($dblink) or die ('DB ERROR - Could not close: '.mysql_error()); 
} 

PHP文件:

require("/mnt/library/configdb.php");   
require("/mnt/library/accessdb.php"); 

//Connect to SQL DB 
db_config_cables(); 
db_connect(); 

$unsafe_variable = $_POST['unsafe_variable']; 

mysql_query("INSERT INTO tablename (column_name,...) VALUES('$unsafe_variable',...)") 
/* close connection */ 
close_db(); 
+0

“INI vs mysqli_connect”没有多大意义,因为您需要使用某种方法(如mysqli_connect)连接到数据库,而与配置的来源无关。您可以将其存储在.ini文件或YAML文件中或... – feeela 2013-05-03 18:41:37

回答

0

所有我不首先在服务器上

function db_config_cables() 
{ 
//Parse and store the db ini file, this will return an associative array 
global $dbhost, $dbuser, $dbpass, $dbname; 
//Point to global ini file 
$config_info = parse_ini_file('config.ini', true); 
//Call specific db 
$dbhost = $config_info['tablename_here']['db_host']; 
$dbuser = $config_info['tablename_here']['db_user']; 
$dbpass = $config_info['tablename_here']['db_pass']; 
$dbname = $config_info['tablename_here']['db_name']; 
} 

ACCESSDB文件不要理解为什么你的担心是一件可以忽略不计的事情,而你却仍然处于危险之中。

接下来,我强​​烈建议PDO而不是mysqli。

现在你的问题。
我根本没有看到太多问题。

您目前的设置已经很灵活了。当移动到新服务器时,只需在/mnt/configdb.php中更改DB凭证 - 就这些了。

所以,我什么了没。

相同/mnt/configdb.php文件,其中包含任何凭据和实际的连接代码(因为我看到在具有不同的连接功能,是没有意义的。如果你是其中的凭据 - 你是也将连接)。然后include_once()它无论我需要一个数据库连接:

require("/mnt/library/configdb.php");   
$stm = $pdo->prepare("INSERT INTO tablename (column_name,...) VALUES(?,...)"); 
$srm->execute(array($_POST['unsafe_variable'])); 

仅此而已。

+1

发布的代码包含旧的非mysqli代码作为“旧方式示例”。业务承认需要占位符,即使它们没有显示。另外,为什么PDO超过mysqli? – user2246674 2013-05-03 18:26:34

+0

,因为PDO本身规范化并以正确的方式插入时转义所有字符串,并支持mysqli(以及其他数据库类型)。它可以通过它的连接参数配置 – 2013-05-03 18:33:54

+1

@WillyPt PDO与mysqli无关。后者不是数据库服务器,但只是驱动程序的MySQL DB – 2013-05-03 18:35:57

2

首先,我会建议去PDO,而不是mysqli。

其次,不要见好就收vlnerable代码挂在那里..它真的很容易在函数mysql_escape_string

第三包不安全的增值经销商,我强烈建议使用模型映射的抽象,而不是直接的SQL语句。这将节省您首先编写95%的查询。此外,你可以编写一个代码生成器,从你的数据库为你生成你的模型/映射器代码。听起来很难,但实际上超级超级简单。

+0

不成问题。在这个SO问题中提出并回答:http://stackoverflow.com/questions/13569/mysqli-or-pdo-what-are-the-pros-and-cons – Zak 2013-05-03 18:27:17

+0

将原因转化为适当的答案 - 它很容易在评论中丢失。 – user2246674 2013-05-03 18:27:53

+0

感谢您的mysql_escape_string提示!我有很多要学习的... – jflay 2013-05-03 19:05:34