0

Tengo un problema al intentar insertar en mi base de datos vía php. En un archivo php llamado sql.php por medio de post mando a insertar a una base de datos desde otro archivo php llamado usuario_alta.php, pero me da el error "Call to a member function query() on null" al momento de insertar. Archivo sql.php:

<?php

define('DB_SERVER', 'localhost:3306');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'empleados');
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);

function insert_datosp($matricula, $nombre, $apellido_p, $apellido_m, $fecha_nac, 
$sexo, $curp, $rfc, $ciudad, $pais, $edo_civil, $correo_e, $direccion, 
$puesto, $sede, $estatus, $comentarios) {

    $sql = "INSERT INTO t_datosp (id_empleado, matricula, nombre, 
    apellido_p, apellido_m, fecha_nac, sexo, curp, rfc, ciudad, pais, 
    edo_civil, correo_e, direccion, puesto, sede, estatus, comentarios)
    VALUES ('$matricula', '$nombre', '$apellido_p', '$apellido_m', '$fecha_nac', 
    '$sexo', '$curp', '$rfc', '$ciudad', '$pais', '$edo_civil', '$correo_e',
    '$direccion', '$puesto','$sede', '$estatus', '$comentarios')";

    if ($db->query($sql) === TRUE) {
        echo "New record created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $db->error;
    }
?>

Código php de archivo usuario_alta.php:

<?php
 insert_datosp($cmatricula, $cnombre, $capellidop, $capellidom,$cfecha, $csexo,
 $ccurp, $crfc, $cciudad, $cpais, $ccivil,$cemail, $cdireccion, $cpuesto, $csede,
 $cstatus, $ccoment );
 }
?>
  • `$db` es `NULL`, o sea, no se está creando la conexión. ¿Algún error en las credenciales? Recomiendo que uses el estilo orientado a objetos en todo tu código. Por ejemplo: `$db = new mysqli(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE); if ($db->connect_errno) { echo "Error: " . $db->connect_error ; } else { //resto de tu código... }` ahí te dirá el error de conexión. – A. Cedano Jan 10 '19 at 17:15
  • Ok, ya veo el problema. El objeto de conexión no está en el ámbito de la función `insert_datosp` ... aunque esté en el mismo archivo. Debes, o crear la conexión dentro de la función, o pasársela en parámetro. – A. Cedano Jan 10 '19 at 17:19

2 Answers2

0

estas utilizando 2 tipos de metodo haciendo conexion en procedimiento y utilizando los metodos de un objeto:

orientado a objetos:

$db = new mysqli(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
$resultado = $db->query($sql)

procedimiento:

 $db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
 $resultado = mysqli_query($db,$sql);

referencia desde la web oficial:
mysqli query

Bryro
  • 8,278
  • 1
  • 7
  • 24
0

El error (si es que la conexión es válida) es que $db no está dentro del ámbito de la función insert_datosp, aunque estén en el mismo archivo... en PHP puede ser confusa la cuestión del àmbito de las variables1.

Entonces, debes pasarle $db a la función para que trabaje con ella, o crear $db dentro de ella (no recomendable).

En tu caso hay un claro problema de organización de código. Yo crearía un archivo para la conexión solamente y lo usuaría donde quiera que necesite conectar.

Veamos:

conexion.php

define('DB_SERVER', 'localhost:3306');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'empleados');
$db = new mysqli(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE); 
if ($db->connect_errno) { 
    $db=NULL;
}

Es un archivo muy básico, para no complicarte. Lo suyo sería quizá una clase que gestione la conexión, pero ese es otro asunto.


usuario_alta.php

 include ('conexion.php'); //pondría $db en el contexto

 
 insert_datosp($cmatricula, $cnombre, $capellidop, $capellidom,$cfecha, $csexo,
 $ccurp, $crfc, $cciudad, $cpais, $ccivil,$cemail, $cdireccion, $cpuesto, $csede,
 $cstatus, $ccoment,$db); //nótese que agregamos un parámetro $db en la llamada


//Nótese que la función tiene un nuevo parámetro

function insert_datosp($matricula, $nombre, $apellido_p, $apellido_m, $fecha_nac, 
$sexo, $curp, $rfc, $ciudad, $pais, $edo_civil, $correo_e, $direccion, 
$puesto, $sede, $estatus, $comentarios,$db) {
    
    $sql = "INSERT INTO t_datosp (id_empleado, matricula, nombre, 
    apellido_p, apellido_m, fecha_nac, sexo, curp, rfc, ciudad, pais, 
    edo_civil, correo_e, direccion, puesto, sede, estatus, comentarios)
    VALUES ('$matricula', '$nombre', '$apellido_p', '$apellido_m', '$fecha_nac', 
    '$sexo', '$curp', '$rfc', '$ciudad', '$pais', '$edo_civil', '$correo_e',
    '$direccion', '$puesto','$sede', '$estatus', '$comentarios')";

    if ($db->query($sql) === TRUE) {
        echo "New record created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $db->error;
    }
}

Notas:

  1. Quizá esta pregunta y su(s) respuesta(s) ayuden a aclara conceptos: ¿Cuál es el ámbito y el ciclo de vida «real» de una variable global en PHP?
A. Cedano
  • 86,578
  • 19
  • 122
  • 221