0

¿Alguien me puede ayudar a solucionar este error? el error que me arroja es el siguiente:

"Warning: mysqli_query() expects parameter 1 to be mysqli, null given in ..."

<?php 

include 'odbc.php';
/*datos personales*/

$nombre = $_POST['nom']; 
$rut = $_POST['rut']; 
$fono = $_POST['fono']; 
$email=$_POST['email']; 
//conectar();
$insertarv="INSERT INTO vendedor(idVendedor,nombreVendedor,fonoVendedor,emailVendedor) VALUES('$rut','$nombre','$fono','$email')";
//ejecutar insert

$ejecutar= mysqli_query($con,$insertarv);
if(!$ejecutar){
    echo mysql_error()."Error !!";
}else{
    echo "El vendedor de registro exitosamente en la BD";
}
?>

En la clase odbc :

<?php
function conectar(){
$user="xxxx";
$pass="xxxx";
$server="localhost";
$db="vende";
$con=mysql_connect($server,$user,$pass);
if(!$con){
    echo("Error al conectar a la base de datos odbc".mysql_error());
}

mysql_select_db($db,$con) or die ("Error al conectar a la base de datos odbc".mysql_error());

return $con;
}
?>
Dev. Joel
  • 23,229
  • 3
  • 25
  • 44

4 Answers4

3

Estas obteniendo los siguientes datos:

$nombre = $_POST['nom']; 
$rut = $_POST['rut']; 
$fono = $_POST['fono']; 
$email=$_POST['email']; 

Ahora en el INSERT estás tratando de insertar la información que obtienes en el siguiente POST $rut = $_POST['rut']; a la columna del id del vendedor.

Debes cambiar esto idVendedor por la columna que realmente corresponde a $rut = $_POST['rut'];

$insertarv="INSERT INTO vendedor(idVendedor,nombreVendedor,fonoVendedor,emailVendedor) VALUES('$rut','$nombre','$fono','$email')";

Estoy completamente convencido de que hace falta añadir una nueva columna en la tabla de datos para insertar este valor o dato que recibes $rut = $_POST['rut']; no creo que esto $rut sea el id del vendedor, estas forzando insertar datos en una columna int que corresponde a idVendedor por eso muestra el error.

Intenta insertar solo los 3 datos, luego me darás la razón, a que me refiero.

Reemplaza el código anterior, por este:

<?php 

  include 'odbc.php';
  /*datos personales*/

  $nombre = $_POST['nom']; 
  $rut = $_POST['rut']; 
  $fono = $_POST['fono']; 
  $email=$_POST['email']; 

  $insertarv="INSERT INTO vendedor(nombreVendedor,fonoVendedor,emailVendedor) VALUES ('$nom','$fono','$email')";
  //ejecutar insert
  $ejecutar= mysqli_query($con,$insertarv);
  if(!$ejecutar){
    echo "Error al ingresar los datos del vendedor ".mysqli_error($con);
  }else{
    echo "El vendedor de registro exitosamente en la BD";
  }
?> 

Por otra parte en la conexión a la base de datos estas mezclando ambas extensiones MySQL y MySQLi

Cambia la conexión a la base de datos por esto:

<?php

  $con = mysqli_connect('localhost','','','demo'); 

  // Si la conexión falla, aparece el error 
  if($con === false) { 
    echo 'Ha habido un error <br>'.mysqli_connect_error(); 
  } else {
    echo 'Conectado a la base de datos';
  }
?>

O conexión estilo orientado a objetos

<?php
  //Configuración.
  $ServerName = "Localhost";
  $Username = "root";
  $PassWord = "";
  $DataBase = "demo";    

  //Creamos conexión.
  $con = new mysqli($ServerName, $Username, $PassWord, $DataBase);

  //Comprobamos conexión.
  if ($con->connect_error) {
    exit("Error de conexión: " . $con->connect_error);
  }

  //Caracteres UTF-8 para MySQL.
  if (!$con->set_charset("utf8")) {
    printf("Error cargando el conjunto de caracteres utf8: %s\n", $con->error);
    exit();
  }
?>

No está demás recomendarte utilizar sentencias preparadas para evitar posibles inyecciones SQL, posibles vulnerabilidades del sistema entre otros.

Más información sobre el tema, leer las siguientes fuentes:

Publisere.com
  • 2,384
  • 5
  • 14
  • Arregle las correcciones pero el error persiste – Johann Sebastian Painevil Len Dec 10 '17 at 02:04
  • 1
    @JohannSebastianPainevilLen Tratar de verificar si están bien escritas las columna de las tablas en el `INSERT INTO` anteriormente estas tratando de insertar datos en el `id` del vendedor el dato que tenia la variable `'$rut'` trata de insertar los datos en orden según como esta estructurada las columnas, *o añade la tabla a tu pregunta para poder ver mejor que fallo existe sin saber como esta estructurada la tabla es difícil dar con una respuesta que solucione el problema, el procedimiento es el adecuado tocaría ver las tablas donde tratas de insertar los datos* – Publisere.com Dec 10 '17 at 02:33
  • 2
    @JohannSebastianPainevilLen Actualice nuevamente la pregunta, y aún sigues mezclando `MySQL` con `MySQLi` tenías añadido lo siguiente `echo "Error al ingresar los datos del vendedor ".mysql_error();` ya eso reemplace en el código que acabo de actualizar por lo correspondiente `echo "Error al ingresar los datos del vendedor ".mysqli_error($con);` – Publisere.com Dec 10 '17 at 04:23
1

El posible error es porque estás empleando dos extensiones, en su conexión y la selección de la base de datos usa MySQL que está declarada obsoleta y debería dejar de usar y en mysqli_query MySQLi lo cuál es incorrecto.

mysqli_query espera como primer parámetro el resultado de mysqli_connect es está función que debe emplear para la conexión, recuerde que puede pasar el nombre de la bd como cuarto parámetro. (la opción de ejemplo es al estilo procedimiento , si desea estilo orientado objetos también dejo la forma de hacerlo , pero tendría que reestructurar todo a orientado a objetos)

//procedimientos
$con=mysqli_connect($server,$user,$pass,$db);
//estilo orientado  a objetos
$con= new mysqli($server,$user,$pass,$db);
Dev. Joel
  • 23,229
  • 3
  • 25
  • 44
0

así quedo mi código luego de sus sugerencias

<!doctype html>
<html>
<head>
<title>Vende easy car </title>
<link href="css/style.css" rel="stylesheet" type="text/css" media="all" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


</head>
<body>
<div class="header"> 
  <div class="wrap"> 
 <div class="header-top">
   <div class="logo">
    <a href="index.html"><img src="images/logo.png" alt=""></a>
   </div>
   <div class="menu">
   <div id="cssmenu">
    <ul>
       <li><a href="index.html"><span> Home </span></a></li>
       <li class="active"><a href="vender.html"><span> Vender </span></a></li>
                    <li><a href="contacto.html"><span> Contacto </span></a></li>
    </ul>
            </div>
    </div> 
    <div class="clear"></div> 
    </div>
   </div> 
</div>
<div class="main">
  <div class="content-top">
    <div class="wrap">
    <div class="title3">
 

<?php 

include 'odbc.php';
/*datos personales*/

$nombre = $_POST['nom']; 
$rut = $_POST['rut']; 
$fono = $_POST['fono']; 
$email=$_POST['email']; 

$insertarv="INSERT INTO vendedor(idVendedor,nombreVendedor,fonoVendedor,emailVendedor) VALUES ('$rut','$nom','$fono','$email')";
//ejecutar insert
$ejecutar= mysqli_query($con,$insertarv);
if(!$ejecutar){
 echo "Error al ingresar los datos del vendedor ".mysql_error();
}else{
 echo "El vendedor de registro exitosamente en la BD";
}
?> 

</div>
  </div >
    </div>
  </div> 
        
            </body>
</html>

Y la otra clase

<?php
function conectar(){
$server="localhost";
$user="xxxx";
$pass="xxxx";
$db="vende";


//$con= new mysqli($server,$user,$pass,$db);
$con=mysqli_connect($server,$user,$pass,$db);

  //Comprobamos conexión.

if($con->connect_error){
exit("Error de conecxion conexión: ".$con->connect_error);
} 
 //Caracteres UTF-8 para MySQL.
  if (!$con->set_charset("utf8")) {
    printf("Error cargando el conjunto de caracteres utf8: %s\n", $con->error);
    exit();
  }
  return $con;
}
?>

introducir la descripción de la imagen aquí

  • Que datos recibes aquí `$rut = $_POST['rut'];` porque estas tratando de insertar ese valor al `id` del vendedor al menos que esto `$rut = $_POST['rut'];` este enviando el `id` del vendedor. – Publisere.com Dec 10 '17 at 03:49
  • Aun así, estas mezclando dos estilos, es decir, tu conexión es *estilo orientado a objetos* y tu sentencia es *estilo procedimiento*. Deberías modificar tu sentencia algo como `$ejecutar = $con->query($insertarv);` o cambiar tu conexión a *estilo procedimiento*. – Diablo Dec 10 '17 at 03:49
  • @JohannSebastianPainevilLen Estoy tan completamente convencido de que hace falta añadir una nueva columna en la tabla de datos para insertar este dato `$rut = $_POST['rut'];` no creo que esto `$rut` sea el `id` del vendedor. – Publisere.com Dec 10 '17 at 03:57
0

No es aconsejable que mezcles dos estilos, es decir, el estilo por procedimientos con el estilo orientado a objetos o en tu caso la extención mysqlcon mysqli, de hecho la extensión mysql* fue declarada obsoleta en PHP 5.5.0 y eliminada en PHP 7.0.0. .


Te dejo algunos ejemplos como usar cada estilo, aun así te aconsejo utilizar el último mysqli::prepare, la consulta y los datos se envían al servidor separados entre sí, y por lo tanto no hay posibilidad de que interfieran.

mysqli

Estilo orientado a objetos

conexión:

<?php
  $con = new mysqli("localhost", "user", "password", "vende");

  /* comprobar la conexión */
  if ($con->connect_errno) {
      printf("Falló la conexión: %s\n", $con->connect_error);
      exit();
  }

  //Caracteres UTF-8 para MySQL.
  if (!$con->set_charset("utf8")) {
    printf("Error cargando el conjunto de caracteres utf8: %s\n", $con->error);
    exit();
  }
?>

Tu sentencia insert:

$insertarv="INSERT INTO vendedor(idVendedor,nombreVendedor,fonoVendedor,emailVendedor) VALUES ('$rut','$nom','$fono','$email')";

//ejecutar insert
$ejecutar = $con->query($insertarv);

if(!$ejecutar){
    printf("Error en ejecución: %s\n", $con->error);
}else{
    echo "El vendedor de registro exitosamente en la BD";
}


Estilo por procedimientos (El que estabas usando)

$con = mysqli_connect("localhost", "user", "password", "vende");

/* comprobar la conexión */
if (mysqli_connect_errno()) {
    printf("Falló la conexión: %s\n", mysqli_connect_error());
    exit();
}

/* cambiar el conjunto de caracteres a utf8 */
if (!mysqli_set_charset($con, "utf8")) {
    printf("Error cargando el conjunto de caracteres utf8: %s\n", mysqli_error($con));
    exit();
} 

Tu sentencia insert:

$insertarv="INSERT INTO vendedor(idVendedor,nombreVendedor,fonoVendedor,emailVendedor) VALUES ('$rut','$nom','$fono','$email')";

//ejecutar insert
$ejecutar= mysqli_query($con,$insertarv);

if(!$ejecutar){
    printf("Error en ejecución: %s\n", mysqli_error($con));
}else{
    echo "El vendedor de registro exitosamente en la BD";
}


mysqli::prepare

Sentencias preparadas al estilo orientado a objetos

conexión:

<?php
  $con = new mysqli("localhost", "user", "password", "vende");

  /* comprobar la conexión */
  if ($con->connect_errno) {
      printf("Falló la conexión: %s\n", $con->connect_error);
      exit();
  }

  //Caracteres UTF-8 para MySQL.
  if (!$con->set_charset("utf8")) {
    printf("Error cargando el conjunto de caracteres utf8: %s\n", $con->error);
    exit();
  }
?>

Tu sentencia insert:

$insertarv="INSERT INTO vendedor(idVendedor,nombreVendedor,fonoVendedor,emailVendedor) VALUES (?,?,?,?)";

//Sentencia preparada
$ejecutar = $con->prepare($insertarv);
/* ligar parámetros para marcadores */
$ejecutar->bind_param("isss",$rut,$nom,$fono,$email);
//Ejecutar sentencia.
$rc = $ejecutar->execute();
//Comprobacion de ejecución
if(false===$rc){
    printf("Error en ejecución: %s\n", $ejecutar->error);
}else{
    echo "El vendedor de registro exitosamente en la BD";
}

mysqli::prepare mysqli_stmt::bind_param


Nota: si idVendedor se auto_increment y también es tu primary key no es necesario añadirla.

Podría quedar así:

"INSERT INTO vendedor (nombreVendedor,fonoVendedor,emailVendedor) VALUES ('$nom','$fono','$email')";

Ahora si $rut = $_POST['rut']; es un dato diferente a tu idVendedor entonces deberías añadir dicha columna a tu sentencia, es importante que añades tu columnas según la orden en como la creaste en tu phpMyAdmin.

Podría quedar así:

"INSERT INTO vendedor (columna_ruta,nombreVendedor,fonoVendedor,emailVendedor) VALUES ('$rut','$nom','$fono','$email')";

Diablo
  • 6,417
  • 2
  • 21
  • 40