not - php mysqli error number
La función PHP para la conexión mysqli da error (3)
Más nuevo para crear funciones php y mysql. Tengo la función de conectarme a una base de datos db_conect_nm (). Esto está en el archivo db_fns.php, y contiene el usuario y la contraseña para conectarme a mi db. Creé esto para tener una conexión db más segura. Lo tenía en un directorio fuera de public_html, y recibí el error PHP Warning: mysqli::mysqli() [<a href=''mysqli.mysqli''>mysqli.mysqli</a>]: (28000/1045): Access denied for user ''negoti7''@''localhost'' (using password: NO) ...
Buscando soluciones, vi comentarios que indicaban que tal vez este usuario de db no tenía permiso de root, así que lo puse en un directorio en public_html, el mismo directorio que el programa donde se está llamando. Todavía recibo el mismo error.
He probado la conexión sin ser una función, y funciona. ¿Qué está mal y por qué esto no funciona como una función? Realmente quiero poner esto en otro lugar que no sea en el código directamente y hacerlo más seguro.
contenido 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;
}
?>
Lo llamo desde nm_functions.php, db_fns.php está incluido allí.
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
?>
¿Algunas ideas? Gracias
¿Podría ser el alcance de las variables? ¿Has intentado definir las variables dentro de la función para probar?
Me gusta esto:
<?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;
}
?>
Sus variables de conexión no tienen un alcance dentro de la función de conexión. O bien debe pasarlos como parámetros a la función (preferible) o usar la palabra clave global
dentro para hacer referencia a ellos:
function db_connect_nm($host, $nm_user, $nm_pword, $nm_name)
{
$nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name);
//etc...
}
Alternativo, no preferido:
function db_connect_nm()
{
global $host, $nm_user, $nm_pword, $nm_name;
$nm_connect = new mysqli($host, $nm_user, $nm_pword, $nm_name);
//etc...
}
Usted está :
- primero, declarar algunas variables, fuera de cualquier función
- luego, tratando de usar esas variables desde dentro de una función.
Las variables declaradas fuera de una función no son, por defecto, visibles desde el interior de esa función.
Sobre eso, debe leer la sección de alcance de la variable del manual.
Dos posibles soluciones:
- Use la palabra clave
global
para importar esas variables en su función, haciéndolas visibles - O defina constantes , en lugar de variables , lo que tiene sentido para los valores de configuración.
En el primer caso, su función se vería así:
// 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;
}
Y, en el segundo caso, primero define
las constantes:
define(''DB_HOST'', ''localhost'');
define(''DB_DBNAME'', ''myname_databasename'');
define(''DB_USER'', ''myname_dbusername'');
define(''DB_PASSWORD'', ''password'');
Y, luego, use esas constantes:
// 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;
}
Esta segunda solución es probablemente más limpia que la primera ;-)