Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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,我有下面的代码来做一个简单的图像上传和存储一些数据,但是我想删除代码中包含直接数据库用户名密码和主机的部分,在标题中使用一个简单的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);