Функция PHP для подключения MySQL дает ошибку - PullRequest
1 голос
/ 24 апреля 2011

Новее для создания функций PHP и MySQL.У меня есть функция для подключения к базе данных db_conect_nm ().Он находится в файле db_fns.php и содержит имя пользователя и пароль для подключения к моей базе данных.Я создал это, чтобы иметь более безопасное соединение с БД.У меня это было в каталоге за пределами public_html, и я получил ошибку PHP Warning: mysqli::mysqli() [<a href='mysqli.mysqli'>mysqli.mysqli</a>]: (28000/1045): Access denied for user 'negoti7'@'localhost' (using password: NO) ...

В поисках решений я увидел комментарии, которые указывали, что, возможно, у этого пользователя БД нет прав от root, поэтому я поместил его в каталогв public_html, тот же каталог, что и программа, в которой он вызывается.Я все еще получаю ту же ошибку.

Я проверил соединение, не будучи функцией, и это работает.Что не так, и почему это не работает как функция?Я действительно хочу поместить это куда-то еще, чем непосредственно в коде, и сделать его более безопасным.

db_fns.php content

<?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

?>

Есть идеи?Спасибо

Ответы [ 3 ]

1 голос
/ 24 апреля 2011

Может ли это быть областью видимости переменных? Вы пытались определить переменные внутри функции для проверки?

Как это:

<?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; 
}

?>

0 голосов
/ 24 апреля 2011

Ваши переменные соединения не ограничены внутри функции соединения. Вам нужно либо передать их в качестве параметров функции (предпочтительно), либо использовать ключевое слово 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...
}
0 голосов
/ 24 апреля 2011

Вы находитесь:

  • сначала объявляем некоторые переменные вне каких-либо функций
  • затем пытаемся использовать эти переменные внутри функции.

Переменные, объявленные вне функции, по умолчанию не видны изнутри этой функции.

Об этом вам следует прочитать раздел Variable scope руководства.


Два возможных решения:

  • Используйте ключевое слово 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; 
}

Это второе решение, вероятно, более чистое , чем первое; -)

...