如何避免在每个php页面上包含登录凭据、将凭据存储在单个页面中以及调整代码以匹配调整
我有下面的代码来做一个简单的图像上传和存储一些数据,但是我想删除代码中包含直接数据库用户名密码和主机的部分,在标题中使用一个简单的如何避免在每个php页面上包含登录凭据、将凭据存储在单个页面中以及调整代码以匹配调整,php,mysql,Php,Mysql,我有下面的代码来做一个简单的图像上传和存储一些数据,但是我想删除代码中包含直接数据库用户名密码和主机的部分,在标题中使用一个简单的include(“config.php”)。因此,除了include(“config.php”)行之外,我要问的是如何调整代码示例:$conn=$db->prepare($query)等等 <?php include("config.php"); define('UPLOAD_PATH', $_SERVER['DOCUMENT_ROOT'] . 'photoh
include(“config.php”)
。因此,除了include(“config.php”)
行之外,我要问的是如何调整代码示例:$conn=$db->prepare($query)代码>等等
<?php
include("config.php");
define('UPLOAD_PATH', $_SERVER['DOCUMENT_ROOT'] . 'photohandling/uploads/');
define('DISPLAY_PATH', '/photohandling/uploads/');
define('MAX_FILE_SIZE', 2000000);
$permitted = array('image/jpeg', 'image/pjpeg', 'image/png', 'image/gif','image/tiff');
$dames2=time();
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'password';
$db_name = 'test';
if (!empty($_POST)){
$fileName = $_FILES['userfile']['name'];
$tmpName = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];
$fname=$_POST['fname'];
$lname=$_POST['lname'];
$age=$_POST['age'];
$acquirer_bin=$_POST['acquirer_bin'];
$terminal_id=$_POST['terminal_id'];
$trace_id=$_POST['trace_id'];
// get the file extension
$ext = substr(strrchr($fileName, "."), 1);
// generate the random file name
$randName = md5(rand() * time());
// image name with extension
$myfile = $acquirer_bin.$trace_id.$dames2.$randName . '.' . $ext;
// save image path
$path = UPLOAD_PATH . $myfile;
if (in_array($fileType, $permitted) && $fileSize > 0 && $fileSize <= MAX_FILE_SIZE) {
//store image to the upload directory
$result = move_uploaded_file($tmpName, $path);
if (!$result) {
echo "Error uploading image file";
exit;
} else {
$db = new mysqli("localhost", "root", "hynes21", "test");
if (mysqli_connect_errno()) {
printf("Connect failed: %s<br/>", mysqli_connect_error());
}
$query =
"INSERT INTO tester(fname,lname,age, acquirer_bin, terminal_id, trace_id,photo_name, size, type, file_path) VALUES(?,?,?,?,?,?,?,?,?,?)";
$conn = $db->prepare($query);
if ($conn == TRUE) {
$conn->bind_param("ssiisisiss",$fname,$lname,$age,$acquirer_bin,$terminal_id,$trace_id, $myfile, $fileSize, $fileType, $path);
if (!$conn->execute()) {
echo 'error insert';
} else {
echo 'Success!<br/>';
echo '<img src="' . DISPLAY_PATH . $myfile . '"/>';
}
} else {
die("Error preparing Statement");
}
}
} else {
echo 'error upload file';
}
} else {
echo 'error';
}
?>
您真的不应该在代码中定义数据库凭据。这样做的一个确切原因是使用配置文件PHP
提供了一个名为parse_ini_file
的内置函数,该函数非常适合从配置文件(以特定的ofc格式)检索数据
下面是一个可由解析的ini
文件的示例
正如您所见,该文件的格式与php.ini
文件非常相似
将此db.ini
文件保存在web服务器无法访问但可由PHP
读取的位置
这里有一个函数,可以利用ini文件中的数据为您创建一个新的mysqli对象
// somefile.php
function new_db() {
$info = parse_ini_file('db.ini', true);
return new mysqli($info['db']['host'],
$info['db']['user'],
$info['db']['pass'],
$info['db']['database']);
}
使用新的\u db
功能
require_once 'somefile.php';
$db = new_db();
$stmt = $db->prepare($query);
// ...
如果我理解正确,您希望使用config.php中定义的值。如果是这样,您只需执行以下操作:
config.php
define(DB_HOST, 'localhost');
define(DB_USER, 'root');
define(DB_PASS, 'hynes21');
define(DB_NAME, 'test');
包含config.php的php文件
备选案文1:
$db_host = DB_HOST;
$db_user = DB_USER;
$db_pass = DB_PASS;
$db_name = DB_NAME;
$db = new mysqli($db_host, $db_user, $db_pass, $db_name);
备选案文2:
$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
是的,一堆ppl会告诉你使用PDO而不是mysqli。的确,您应该这样做,但这并不能回答您的问题:)假设在config.php文件中有以下内容:
$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = 'hynes21';
$dbName = 'test';
然后在上面的代码中替换这一行:
$db = new mysqli("localhost", "root", "hynes21", "test");
为此:
$db = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
由于变量作用域,代码的其余部分应该可以正常工作
您还可以将db连接放在config.php文件中,这将允许您销毁存储的连接信息变量,以便它们不会因意外输出而挂在任何地方:
$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = 'hynes21';
$dbName = 'test';
$db = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
unset($dbHost);
unset($dbUser);
unset($dbPass);
unset($dbName);
这意味着每个页面加载都会有调用mysqli()的开销,即使该页面没有使用数据库。但是如果你有一个数据驱动的站点,那么几乎每个页面都会想调用mysqli(),所以这不是什么大问题
稍后,您可能会考虑使用数据库包装器,这样您就不必将DB连接存储在本地范围的变量中,但这种方法对于简单的应用程序来说效果很好。如果包含两次config.php
,会发生什么情况?这不重要,但是您也可以这样做,而不是使用include:require_once('config.php');1.您的示例不是有效的PHP。2.如果你包含'config.php'
两次,并且你没有防备define
语句,你会得到一个php通知
。创建全局可访问对象作为包含文件的副作用只是一种不好的做法。我同意你的看法,但OP没有询问最佳做法。非常感谢@robbmj
$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = 'hynes21';
$dbName = 'test';
$db = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
unset($dbHost);
unset($dbUser);
unset($dbPass);
unset($dbName);