Hola a todos. Hace unos días empecé a estudiar PHP y llegué a la parte de las BD. Logré implementar un pequeño formulario que recopila unos datos y los almacena en una BD llamada "trabajo" en una tabla "datos". Luego los llamo desde otra página y los muestro en una tabla donde tengo un boton de borrar. El botón puede borrar el campo sin problemas, pero lo que quiero es que antes de borrar los datos de la tabla "datos" los inserte en otra tabla llamada "eliminados" para que no se pierdan los datos, sino que dejen de estar en la tabla principal (No sé si me hago entender).
Estos son los datos del formulario
<!-- index.php-->
<html>
<head>
<title>Registro de Ordenes de Trabajo</title>
</head>
<body>
<center><H2>Registro de Ordenes de Trabajo</h2>
<form action="bd.php" method="post" target="_blank">
<table border='1'>
<tr><td>No. de Orden</td><td><input type="text" name="orden"></td></tr>
<tr><td>Nombre completo del trabajador</td><td><input type="text" name="trabajador"></td></tr>
<tr><td>Departamento</td><td><select name="departamento"><option value="produccion">produccion<option value="tratamiento termico">tratamiento termico</option><option value="taladro">taladro</option><option value="metrologia">metrologia</option><option value="tecnologia">tecnologia</option><option value="cnc">cnc</td></tr>
<tr><td>Fecha de Entrada (dd/mm/aaaa)</td><td align="center"><input type="text" size="2" name="diai"><input type="text" size="2" name="mesi"><input type="text" size="4" name="anioi"></td></tr>
<tr><td>Fecha de Finalizacion (dd/mm/aaaa)</td><td align="center"><input type="text" size="2" name="diaf"><input type="text" size="2" name="mesf"><input type="text" size="4" name="aniof"></td></tr>
<tr align="center"><td></td><td><input type="submit" value="enviar" name="enviar"><input type="reset" value="limpiar" name="limpiar"></td></tr>
</table>
</form>
</center>
</body>
</html>
Esta es la página que procesa los datos y redirecciona hacia la página donde está la tabla
<?php
//bd.php
//Primero comprobamos que la fecha esté correcta
if (checkdate($_REQUEST['mesi'], $_REQUEST['diai'], $_REQUEST['anioi']) || checkdate($_REQUEST['mesf'], $_REQUEST['diaf'], $_REQUEST['aniof']))
{
$fechai=$_REQUEST['anioi']."-".$_REQUEST['mesi']."-".$_REQUEST['diai'];
$fechaf=$_REQUEST['aniof']."-".$_REQUEST['mesf']."-".$_REQUEST['diaf'];
//creamos la variable para la conexion y la variable para la tabla
$conexion=mysqli_connect("localhost", "root", "") or die("Problemas de conexion");
$tabla="datos";
$bd="trabajo";
$tabla2="elementos_eliminados";
//seleccionamos la base de datos
mysqli_select_db($conexion, $bd)or die ("Problemas en la seleccion de la BD");
//Añadir datos a la BD
mysqli_query($conexion, "insert into $tabla (orden, trabajador, departamento, fechainicio, fechafinal) values ( '$_REQUEST[orden]', '$_REQUEST[trabajador]', '$_REQUEST[departamento]', '$fechai', '$fechaf')") or die ("Problemas al añadir elementos a la BD".mysqli_error());
mysqli_close($conexion);
header("location:listado_orden.php");
}
else
{
echo ("La fecha introducida es incorrecta");
}
?>
Luego los datos se muestran en esta página:
<html>
<head>
<title>Listado de Ordenes de Trabajo</title>
</head>
<?php
/*ahora el invento: que debajo aparezcan todos los campos en una tabla dinámica que crezca con cada registro que se haga en la BD*/
$conexion=mysqli_connect("localhost", "root", "") or die("Problemas de conexion");
$tabla="datos";
$bd="trabajo";
mysqli_select_db($conexion, $bd)or die ("Problemas en la seleccion de la BD");
$registro=mysqli_query ($conexion, "select id, orden, trabajador, departamento, fechainicio, fechafinal from $tabla") or die ("Problemas en la seleccion".mysqli_error());
echo ("<h2>Listado Actualizado</h2>");
echo ("<table border='2'>");
echo ("<tr><td align='center'>Orden</td><td align='center'>Trabajador</td><td align='center'>Departamento</td><td align='center'>Fecha Inicial</td><td align='center'>Fecha Final</td><td align='center'>Editar</td><td align='center'>Eliminar</td></tr>");
while ($reg=mysqli_fetch_array($registro))
{
echo ("<tr><td align='center'>$reg[orden]</td><td align='center'>$reg[trabajador]</td><td align='center'>$reg[departamento]</td><td align='center'>$reg[fechainicio]</td><td align='center'>$reg[fechafinal]</td><td align='center'><a href='edit.php?id=$reg[id]'><img src='images/edit.png'></img></a></td><td align='center'><a href='borrar.php?id=$reg[id]'><img src='images/deny.png'</img></a></td></tr>");
}
echo ("</table>");
mysqli_close($conexion);
?>
</body>
</html>
y como ven, hay un enlace para borrar el contenido asociado al id. Y aquí está el problema
<?php
//borrar.php
/*implementar un algoritmo que al presionar en el boton "borrar" elimine ese usuario de la bd*/
//conectar con la BD
$conexion=mysqli_connect("localhost", "root", "") or die("Problemas de conexion");
$tabla="datos";
$bd="trabajo";
$tabla2="eliminados";
$ids=$_REQUEST['id'];
$fechaeliminado=date("Y")."-".date("m")."-".date("d");
//seleccion de datos
mysqli_select_db($conexion, $bd) or die("Problemas en la seleccion de la BD");
//crear registros
$registro=mysqli_query($conexion, "select * from $tabla where id=$ids") or die ("Problemas al seleccionar desde la BD".mysqli_error());
echo ("<h2>Listado Actualizado</h2>");
echo ("<table border='2'>");
echo ("<tr><td align='center'>id</td><td align='center'>Orden</td><td align='center'>Trabajador</td><td align='center'>Departamento</td><td align='center'>Fecha Inicial</td><td align='center'>Fecha Final</td><td align='center'>Fecha Eliminado</td></tr>");
if ($reg=mysqli_fetch_array($registro))
{
//Insertamos los datos que se van a borrar en la otra tabla llamada "eliminados"
mysqli_query($conexion, "insert into $tabla2 (id, orden, trabajador, departamento, fechainicio, fechafinal) values ( $reg[id], $reg[orden], $reg[trabajador], $reg[departamento], $reg[fechainicio], $reg[fechafinal], $fechaeliminado") or die ("Problemas al anadir elementos a la BD '$tabla2'<br>".mysqli_error());
//Eliminar datos de la tabla
mysqli_query($conexion, "delete from $tabla where id='$_REQUEST[id]'") or die ("Problemas al borrar".mysqli_error());
//Cerramos la conexion a la BD
mysqli_close($conexion);
//Redireccionamos a la pagina anterior para ver los datos
header("location:listado_orden.php");
?>
Y cuando ejecuto la consulta me arroja el siguiente error:
Warning: mysqli_error() expects exactly 1 parameter, 0 given in C:\wamp\www\Trabajo\borrar.php on line 29
Por favor ayudenme. Estoy aprendiendo y si no puedo pasar de aqui no quiero entrar en otros temas más complicados
CitarWarning: mysqli_error() expects exactly 1 parameter, 0 given in C:\wamp\www\Trabajo\borrar.php on line 29
traduzco:
Warning: mysqli_error() esperaba exactamente 1 parametro, 0 dados
aquí la pagina oficial... por si más dudas... lee eso antes de repsonder cualquier cosa a este tema
http://php.net/mysqli_error (http://php.net/mysqli_error)
Gracias por el consejo, decidí hacer esto
mysqli_error($link);
en el or die y me arroja el siguiente texto:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Paula, produccion, 2016-12-25, 2016-12-27, 2016-12-28' at line 1
Puede ser debido a que el campo trabajador tiene mas de una palabra? O sea, no separé el trabajador por nombre, apellido sino que en el campo trabajador el formato es "nombre apellido"?
CitarYa revisé la documentación y nada
claramente no estás leyendo ni lo que escribí ni la documentación...
solo te repetiré todo pero en imagenes para centrarte en que leer
el error
(http://i.imgur.com/OF5Jtm6.png)
(http://i.imgur.com/racQKCT.png)
tu codigo
(http://i.imgur.com/vCKM0Bg.png)
(http://i.imgur.com/cfjnzat.png)
la documentación
(http://i.imgur.com/3xTiuHK.png)
Parece que coincidimos al escribir. Mientras me escribías que me fijara bien y lo hacías muy didáctico, yo modificaba el comentario donde decía que si a la función
mysqli_error()
le paso como parámetro la conexion quedando así
mysqli_error($conexion);
entonces el texto cambia a
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Donde la traduccion india de Google dice:
Usted tiene un error en su sintaxis de SQL; Compruebe el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de '' en la línea 1
Puede ser alguna " que esté mal puesta? Me siento frustrado y solo llevo 1 semana.
ese es un error de alguna sentencia sql... revisa cual sentencia da ese error
la sentencia es la siguiente:
mysqli_query($conexion, "insert into $tabla2 (id, orden, trabajador, departamento, fechainicio, fechafinal, fechaeliminado) values ( '$reg[id]', '$reg[orden]', '$reg[trabajador]', '$reg[departamento]', '$reg[fechainicio]', '$reg[fechafinal]', '$fechaeliminado'") or die ("Problemas al anadir elementos a la BD '$tabla2'<br>".mysqli_error($conexion));
pero si hago esto antes de poner la sentencia:
echo ("$reg[id], $reg[orden], $reg[trabajador], $reg[departamento], $reg[fechainicio], $reg[fechafinal], $fechaeliminado");
Entonces en el navegador se obtiene esto:
1, 123, Danny Paula, produccion, 2016-12-25, 2016-12-27, 2016-12-28
Problemas al anadir elementos a la BD 'eliminados'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
O sea que los datos están siendo recibidos por la página pero no los añade a la tabla :-\ :-\
no,has echo de la sentencia completa... incluyendo el insert y todo... luego agarras el phpmyadmin y la ejecutas directo sobre la tabla a ver si el problema es como la escribiste o los datos
Dices algo asi:
echo ("insert into $tabla2 (id, orden, trabajador, departamento, fechainicio, fechafinal, fechaeliminado) values ( '$reg[id]', '$reg[orden]', '$reg[trabajador]', '$reg[departamento]', '$reg[fechainicio]', '$reg[fechafinal]', '$fechaeliminado'<br>");
Pues esto es lo que se obtiene:
insert into eliminados (id, orden, trabajador, departamento, fechainicio, fechafinal, fechaeliminado) values ( '1', '123', 'Danny Paula', 'produccion', '2016-12-25', '2016-12-27', '2016-12-28'
Problemas al anadir elementos a la BD 'eliminados'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Ves algo que esté mal o algo así?? :-\
id es de tipo texto ? porque los tipo texto son los que llevan comillas, no lo hacen los tipos numericos... por otro lado... estás ignorando todos los errores
donde está el parentesis de cierre?
# Nombre Tipo Cotejamiento Atributos Nulo Predeterminado Extra Accion
1 id int(11) No Ninguna Cambiar Cambiar Eliminar Eliminar
Así se ve mi campo "id" en el phpMyAdmyn.
Y con respecto a lo de las comillas... Mis más sinceras y frustradas disculpas. Si hago esto:
echo ("insert into $tabla2 (id, orden, trabajador, departamento, fechainicio, fechafinal, fechaeliminado) values ( '$reg[id]', '$reg[orden]', '$reg[trabajador]', '$reg[departamento]', '$reg[fechainicio]', '$reg[fechafinal]', '$fechaeliminado')<br>");
respetando los () en cada caso, obtengo el siguiente resultado
insert into eliminados (id, orden, trabajador, departamento, fechainicio, fechafinal, fechaeliminado) values ( '1', '123', 'Danny Paula', 'produccion', '2016-12-25', '2016-12-27', '2016-12-28')
Problemas al anadir elementos a la BD 'eliminados'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
que es el mismo de la vez anterior
con phpmyadmin puedes ingresar un valor a una tabla... has eso, el te mostrará la sentencia sql que usó y comparala con la tuya a ver que tienes mal... me suena que son comillas, pero no estoy seguro...
Ya lo hice y cuando le di "Crear Código PHP" sale esto
$sql = "INSERT INTO `trabajo`.`eliminados` (`id`, `orden`, `trabajador`, `departamento`, `fechainicio`, `fechafinal`, `fechaeliminado`) VALUES (\'1\', \'123\', \'Danny Paula\', \'produccion\', \'2016-12-25\', \'2016-12-27\', \'2016-12-28\');";
Lo pongo así mismo aunque creo que hay algún error en las comillas del phpMyAdmin. Igual veo que el phpMyAdmin pone
$sql = "insert into (BD).(TABLA)"
pero yo tengo el código dividido por secciones. O sea, yo tengo creo la conexion, selecciono la BD y despues hago la consulta...
Un paso de avance. Cuando dijiste hace un rato que era problemas de comillas lo que hice fue que quite las ' ' de la expresion $reg[variable]:
mysqli_query($conexion, "insert into $tabla2 (id, orden, trabajador, departamento, fechainicio, fechafinal, fechaeliminado) values ( '$reg[id]', '$reg[orden]', \"$reg[trabajador]\", $reg[departamento], $reg[fechainicio], $reg[fechafinal], $fechaeliminado") or die ("Problemas al anadir elementos a la BD '$tabla2'<br>".mysqli_error($conexion));
como ves está sin terminar, pues el error lo da en el trabajador. Cuando llegue a la casa voy a probar creando las tablas de nuevo y separando el nombre de los apellidos en campos diferentes. Pues parece que ahi está el error, pero no puedo lograr que funcione así. A pesar que en la tabla anterior si guardé los datos con espacios en la BD.
tarabajador me imagino que es un tipo de texto... debes pasarlo con comillas si es asi
ya pase los 2 datos que son de tipo text con comillas usando
\"$reg[trabajador]\", \"$reg[departamento]\"
pero sigue dando el mismo error. Algo más para probar? Ya intenté poner las "" dentro de los [] con el \ y nada. Tambien probé usando dentro del [] \' pero tampoco
no... comillas simples siempre... olvidate del \ has tu texto abriendo y cerrando con comillas dobles y usa comillas simples donde deban ir comillas
Antes que todo Felicidades por año nuevo. Gracias a engel lex por brindarme su ayuda cuando podría estar preparando las cosas de fin de año. Al final me senté en mi casa con calma esa noche y lo hice. Lo que tenia mal era que me faltaba un ) en la sentencia. Lo puse y listo. Así que pueden cerrar el tema. Nos vemos en la próxima entrada. Que PHP es interesante y las ayudas son validas