mostrar - php mysql insert error checking
MySQL/Apache Error en la consulta PHP MySQL (11)
Estoy teniendo el siguiente error:
Acceso denegado para el usuario ''apache'' @ ''localhost'' (usando la contraseña: NO)
Al usar el siguiente código:
<?php
include("../includes/connect.php");
$query = "SELECT * from story";
$result = mysql_query($query) or die(mysql_error());
echo "<h1>Delete Story</h1>";
if (mysql_num_rows($result) > 0) {
while($row = mysql_fetch_row($result)){
echo ''<b>''.$row[1].''</b><span align="right"><a href="../process/delete_story.php?id=''.$row[0].''">Delete</a></span>'';
echo ''<br /><i>''.$row[2].''</i>'';
}
}
else {
echo "No stories available.";
}
?>
El archivo connect.php
contiene mis llamadas de conexión MySQL que funcionan bien con mis consultas INSERT
en otra parte del software. Si hago un comentario sobre la línea $result = mysql_query
, pasa a la declaración else. Entonces, es esa línea o el contenido en el if.
He estado buscando soluciones en la red, y la mayoría parecen estar relacionadas con demasiadas conexiones MySQL o que el usuario que estoy iniciando sesión en MySQL no tiene permiso. He verificado ambos. Todavía puedo realizar mis otras consultas en otro lugar del software, y he verificado que la cuenta tiene los permisos correctos.
¿El usuario de apache requiere una contraseña para conectarse a la base de datos? Si es así, entonces el hecho de que dice "usar contraseña: NO" me llevaría a creer que el código está tratando de conectarse sin una contraseña.
Sin embargo, si el usuario de apache no requiere una contraseña, puede ser una buena idea verificar los permisos (que ya mencionó que ya verificó). Todavía puede ser beneficioso intentar ejecutar algo como esto en un indicador de mysql:
GRANT ALL PRIVILEGES ON
databasename.* to ''apache''@''localhost'';
Esa sintaxis debería ser correcta.
Aparte de eso, estoy tan perplejo como tú.
Si de hecho puede insertar utilizando las mismas llamadas de conexión, su problema probablemente recae en el usuario "apache" que no tiene permisos SELECT en la base de datos. Si tiene instalado phpMyAdmin, puede ver los permisos para el usuario en el panel Privilegios. phpMyAdmin también hace que sea muy fácil modificar los permisos.
Si solo tiene acceso a la línea de comando, puede verificar los permisos desde la base de datos mysql.
Probablemente necesites hacer algo como:
GRANT SELECT ON myDatabase.myTable TO ''apache'' @ ''localhost'';
Y si es importante, apache @ localhost no es el nombre de la cuenta de usuario que utilizo para ingresar a la base de datos. No tengo ninguna cuenta de usuario con el nombre apache en ellos para nada.
Si dice ''apache @ localhost'', el nombre de usuario no se transfiere correctamente a la conexión MySQL. ''apache'' es normalmente el usuario que ejecuta el proceso httpd (al menos en los sistemas basados en Redhat) y si no se pasa ningún nombre de usuario durante la conexión MySQL usa a quien llama para la conexión.
Si haces la conexión correcta en tu script, no en un archivo llamado, ¿obtienes el mismo error?
¿El script connect.php realmente establece la conexión o solo define una función a la que necesita llamar para crear una conexión? El error que está recibiendo es sintomático de no tener una conexión previamente establecida.
ETA: también cambie el include a a require. Sospecho que en realidad no incluye el archivo en absoluto. Pero include puede fallar silenciosamente.
Cambie el include () a require (). Si el archivo "connect.php" no puede ser require () d, el script fallará con un error fatal, mientras que include () solo generará una advertencia . Si el nombre de usuario que está pasando a mysql_connect () no es "apache", una ruta incorrecta al script de conexión es la forma más común de obtener este tipo de error.
No olvide verificar los registros de errores de su base de datos. Debería poder ver si está llegando al DB. Si no lo está, debe verificar las reglas de su firewall en la caja. En un cuadro de Linux, puede ejecutar iptables -L para obtener las reglas de la lista de firewall.
De lo contrario, será un problema de acceso puro. Haga un "select * from mysql.user" para ver si el usuario de apache está configurado allí. Además, recomendaría crear una cuenta específica para su aplicación en lugar de usar apache, ya que cualquier otra aplicación que cree se ejecutará como apache de forma predeterminada y podría obtener acceso no autorizado a su base de datos.
Simplemente busque "GRANT" en la documentación @ dev.mysql.com para obtener más información. Si tiene preguntas más específicas con respecto a db, simplemente edite su pregunta, y lo echaré un vistazo.
¡Amigo, la respuesta es un gran DUH! que desafortunadamente también tardé un tiempo en descubrirlo. Probablemente tenga una función como dbconnect () y esté usando variables de un archivo de inclusión para hacer la conexión. $ conn = mysql_connect ($ dbhost, $ dbuser, $ dbpass).
Bien, ya que esto está dentro de una función, las variables del archivo de inclusión deben pasar a la función o la función no sabrá qué $ dbhost, $ dbuser y $ dbpass. Una forma de solucionar esto es hacer que esas variables sean globales para que sus funciones puedan recogerlas. Otra solución que no es muy segura sería escribir su host, usuario y pasar la función mysql_connect.
Espero que esto ayude pero tuve el mismo problema.
¿Recuerdas hacer?
flush privileges;
Si el usuario no está configurado, dará el error ''apache'' @ ''localhost''.
Solo para verificar, si usas solo esta parte, ¿recibes un error?
Si es así, ¿todavía recibe un error si copia y pega uno de esos insertos en esta> página, estoy tratando de ver si es local para la página o esa línea real.
Además, puede publicar una copia de las llamadas de conexión (menos las contraseñas), a menos que las inserciones> usen exactamente la misma sintaxis que este ejemplo.
Aquí está lo que está en el archivo connection.php. Me vinculé al archivo a través de una inclusión de la misma manera que cuando ejecuto las consultas INSERT en otro lugar del código.
$conn = mysql_connect("localhost", ******, ******) or die("Could not connect");
mysql_select_db("adbay_com_-_cms") or die("Could not select database");
Voy a probar la consulta INSERT trabajo en esta área para verificarlo.
En cuanto a las otras publicaciones sobre el acceso a la contraseña. Lo hice, como se indica en mi primera publicación, compruebe los permisos. Utilicé phpMyAdmin para verificar que los permisos para la cuenta de usuario que estaba usando eran correctos. Y si es importante, apache @ localhost no es el nombre de la cuenta de usuario que utilizo para ingresar a la base de datos. No tengo ninguna cuenta de usuario con el nombre apache en ellos para nada.
Solo para verificar, si usas solo esta parte, ¿recibes un error?
<?php
include("../includes/connect.php");
$query = "SELECT * from story";
$result = mysql_query($query) or die(mysql_error());
Si es así, ¿todavía recibe un error si copia y pega uno de esos insertos en esta página, estoy tratando de ver si es local a la página o esa línea real.
Además, puede publicar una copia de las llamadas de conexión (menos contraseñas), a menos que las inserciones utilicen exactamente la misma sintaxis que este ejemplo.
Puede hacer una de las siguientes cosas:
- Agregue el usuario "apache" y configure sus privilegios desde phpmyadmin o usando mysql en un shell
- Dile a php que ejecute
mysql_connect
como otro usuario, alguien que ya tenga los privilegios necesarios (pero tal vez no sea root), busca mysql.default_user en tu archivo php.ini.