2010-09-09 44 views
5

Estoy buscando una forma de probar solo la parte de conexión de una conexión php/mysqli. Estoy migrando de una versión de servidor LAMP en Vista a la misma en Ubuntu y tengo ajustes para que mysqli funcione. Sé que todos los módulos adecuados están instalados, y PhpMyAdmin funciona a la perfección. He migrado un sitio y ninguna de las conexiones de mysqli está funcionando. El error que estoy recibiendo es la llamada a la función de miembro xxx() en no objeto "que generalmente aparece cuando la consulta en sí es incorrecta o la consulta se prepara a partir de una mala conexión. Sé que la consulta en sí es buena porque funciona bien en el otro servidor con la misma estructura de datos y datos. Eso me deja con la conexión. Traté de escribir una conexión de prueba muy simple y lo puso en un bucle como ..Prueba de conexión php/mysqli

if(***connection here ***) 
{ echo "connected"; } 
else 
{ echo "not connected"; } 

Se hace eco de "conectado", que es grande. Pero solo para comprobar, cambié la contraseña en la conexión, así que sabía que no podría conectarse y todavía se hacía eco de "conectado". Por lo tanto, la prueba if/else claramente no es el camino a seguir ....

+0

¿Puede usted por favor mostrar cómo se hace la conexión *** *** aquí (puede excluir al usuario y la contraseña)? – 2ndkauboy

+0

"error de llamada a la función de miembro xxx() en el no objeto" no tiene nada que ver con la conexión de la base de datos. –

Respuesta

11

mysqli_connect() siempre devuelve un objeto MySQLi. Para comprobar si hay errores de conexión, use:

$mysqli_connection = new MySQLi('localhost', 'user', 'pass', 'db'); 
if ($mysqli_connection->connect_error) { 
    echo "Not connected, error: " . $mysqli_connection->connect_error; 
} 
else { 
    echo "Connected."; 
} 
+1

Esto funcionó. Gracias, Lek. Por supuesto, solo profundizó el misterio. Ahora sé que la base de datos se está conectando, lo que significa que mi script realmente está escupiendo el bit en la consulta misma. Esto tiene aún menos sentido ya que la consulta en sí misma funciona en otros servidores. Incluso he escrito una consulta de prueba simple que, por desgracia, aún devuelve el error no objeto. –

+0

else { echo "Conectado"; } agregar; –

0

Necesita más control de errores en las distintas llamadas a la base de datos, entonces. Método rápido/sucio es hacer simplemente

$whatever = mysqli_somefunction(...) or die("MySQL error: ". mysqli_error()); 

Todas las funciones devolver FALSE si se produjo un error, o un objeto mysqli apropiado con los resultados. Sin la comprobación de errores, que estarías haciendo:

$result = $mysqli->query("blah blah will cause a syntax error"); 
$data = $result->fetchRow(); // $result is "FALSE", not a mysqli_object, hence the "call to member on non-object" 
+1

Usar 'mysql_error()' con MySQLi es estúpido;) – Lekensteyn

+0

Sí, error tipográfico. Corregido ahora. –

+0

morir siempre s malo. Al menos envíe el estado 503 y ** nunca ** revele información sensible como el mensaje de error mysql. use trigger_error() en su lugar. Aunque es bastante inútil aquí, como el mensaje de error de PHP ya es bastante informativo, en caso de que –

0

Para la prueba de conexión php en su terminal ejecutar:

$ php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "MYSQL_USER", "MYSQL_PASS"));' 
Cuestiones relacionadas