Более новый для создания php-функций и mysql. У меня есть функция для подключения к базе данных db_conect_nm (). Это находится в файле db_fns.php и содержит пользователя и пароль для подключения к моему db. Я создал это, чтобы иметь более безопасное соединение db. Я получил его в директории за пределами public_html и получил ошибку PHP Warning: mysqli::mysqli() [<a href='mysqli.mysqli'>mysqli.mysqli</a>]: (28000/1045): Access denied for user 'negoti7'@'localhost' (using password: NO) ...
В поисках решений я увидел комментарии, которые указывали, что, возможно, у этого пользователя db не было разрешения от root, поэтому я поместил его в каталог в public_html, тот же каталог, что и программа, где он вызывается. Я все равно получаю ту же ошибку.
Я тестировал соединение, не будучи функцией, и он работает. Что не так, и почему это не работает как функция? Я действительно хочу поставить это где-то, кроме кода, и сделать его более безопасным.
Содержание db_fns.php
<?php //Database server $host= 'localhost'; $nm_name= 'myname_databasename'; //sanitized data $nm_user= 'myname_dbusername'; $nm_pword= 'password'; // db connect to nm database function db_connect_nm() { $nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name); if (!$nm_connect) throw new Exception('Could not connect to NM database currently'); else return $nm_connect; } ?>
Я называю это от nm_functions.php, там включен db_fns.php.
nm_functions.php
<?php require_once('sanitizedpathto/db_fns.php'); ......some code $conn_nm = db_connect_nm(); $result_sub = $conn_nm->query("select * from subscribers where uname='$username'"); .... more code ?>
Есть идеи? благодаря
Может ли это быть областью переменных? Вы пытались определить переменные внутри функции для тестирования?
Как это:
<?php // db connect to nm database function db_connect_nm() { //Database server $host= 'localhost'; $nm_name= 'myname_databasename'; //sanitized data $nm_user= 'myname_dbusername'; $nm_pword= 'password'; $nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name); if (!$nm_connect) throw new Exception('Could not connect to NM database currently'); else return $nm_connect; }
?>
Вы :
Переменные, объявленные вне функции, по умолчанию не видны внутри этой функции.
Об этом вам следует прочитать раздел « Область переменных » руководства.
Два возможных решения:
global
, чтобы импортировать эти переменные в вашу функцию, делая их видимыми В первом случае ваша функция будет выглядеть так:
// db connect to nm database function db_connect_nm() { // Make these outside variables visible from inside the function global $host, $nm_user, $nm_pword, $nm_name; $nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name); if (!$nm_connect) throw new Exception('Could not connect to NM database currently'); else return $nm_connect; }
И во втором случае вы должны сначала define
константы:
define('DB_HOST', 'localhost'); define('DB_DBNAME', 'myname_databasename'); define('DB_USER', 'myname_dbusername'); define('DB_PASSWORD', 'password');
И затем используйте эти константы:
// db connect to nm database function db_connect_nm() { $nm_connect = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DBNAME); if (!$nm_connect) throw new Exception('Could not connect to NM database currently'); else return $nm_connect; }
Это второе решение, вероятно, более чистое, чем первое 😉
Переменные соединения не связаны внутри функции подключения. Вам либо нужно передать их как параметры функции (предпочтительнее), либо использовать global
ключевое слово внутри для ссылки на них:
function db_connect_nm($host, $nm_user, $nm_pword, $nm_name) { $nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name); //etc... }
Альтернативный, не предпочтительный:
function db_connect_nm() { global $host, $nm_user, $nm_pword, $nm_name; $nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name); //etc... }