Problema al Eliminar Resgistros de una tabla de MySQL

Buenas tardes,

Estoy realizando una web para el control de albaranes de una empresa de logistica y aunque ya tengo el acceso de usuarios y la inserción de albaranes que funciona correctamente, tengo un problema con la Eliminación de registros.

El error que me da es el siguiente:

Error #1064: 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 'id='16'' at line 1

Despues de indagar unas cuantas horas no logro encontrar el errro. El codigo que es el siguiente, lo he repasado muchas veces y parece qu es correcto.

<?php

import_request_variables ("P","f_");


if ( ! $link = mysql_connect("xxxxx.xxxx.es","YYYY","xxxxxx"))
{
echo "<a href='index.htm'>Error al conectar</a>";
exit;

}
if ( ! mysql_select_db("YYYY"))
{
echo "<a href='index.htm'>Error al seleccionar BDD</a>";
exit;

}



foreach ($f_borrar as $indice => $valor)

{

if ($valor=="on")
{

$linea1="DELETE FROM albaranes";
$linea2="WHERE id='$indice'";
$consulta=$linea1.$linea2;

echo "$consulta";

if ( ! $result = mysql_query($consulta,$link))
{


if (mysql_query($consulta))
{
echo "FUNCIONO!";
}
else
{
echo "Error #".mysql_errno().": ".mysql_error()."<br>";
}
echo "<a href='index.htm'>Error en el borrado</a>";
exit;

}

}

}

echo "<br>Borrado correcto";
echo "<br><br><a href='areausuaris_eliminarDatos.php'>Eliminar otro albaran</a>";
echo "<br><br><a href='index.htm'>Inicio</a>";




mysql_close($link);
?>

Estoy pensando que el problema lo tengo con los privilegios del Hosting de la Base de Datos. La página la tengo alojada en ARSYS y la version de la base de datos es 3.5.4 y ya me sale un mensaje que ya está la 3.5.8, tambien me sale un warning que dice "El almacenamiento de configuración phpMyAdmin no está completamente configurado, algunas funcionalidades extendidas fueron deshabilitadas", pero he llamado a ARSYS y me comentan que es normal ya que el phpMyAdmin es compartido, pero que no pasa nada.
Desde el panel de control de ARSYS he creado un nuevo usuario y le he dado todos los permisos posibles para ver si asi funcionaba, pero nado no hay forma de eliminar un registro.

Pues bien, espero haberme explicado lo mejor posible y a ver si alguien me puede ayudar.

Muchas gracias
Buenas,

la linea

$linea2="WHERE id='$indice'"; tambien la he probado sin las comillas simples $linea2="WHERE id=$indice"; y tampoco funciona.

Saludos
Hola:

Primero que nada, un detalle: la función import_request_variables está obsoleta, como dice en la documentación de PHP.

Respecto a tu problema, haz un echo o print de los valores de $indice y $valor dentro del foreach, pues creo que estás utilizando la variable incorrecta dentro de la consulta SQL (aunque puede que me equivoque). Por otro lado, lo anterior te permitirá ver si se están pasando los valores correctos (y si no está vacío el arreglo):

foreach( $f_borrar as $indice => $valor ) {
  $sql = "DELETE FROM tabla WHERE id=$valor"; // Según yo, debería ser así :P, pues $indice es el número del arreglo - $array[indice] = valor; - pues eso significa el error MySQL
  // Que se está pasando un valor inesperado.
  echo "<p>Indice: $indice, Valor: $valor</p>";
}

Espero tu respuesta :).
Buenas,

Gracias por tu respuesta, te comento.

Tengo la version de PHP inferior ala 5.4 y he comprobado que si me funciona el import_request_variables .

por otro lado, si pongo la linea marcada en rojo, veo que me sale indice=EL VALOR QUE MARCO CON EL CEHCKBOX y en valor=ON, lo que entiendo que si que pasa un valor correcto ,no??

foreach ($f_borrar as $indice => $valor)

{

if ($valor=="on")
{

$linea1="DELETE FROM albaranes";
$linea2="WHERE id = $indice";
$consulta=$linea1.$linea2;

echo "$consulta";
echo "<p>Indice: $indice, Valor: $valor</p>";

if ( ! $result = mysql_query($consulta,$link))
{


if (mysql_query($consulta))
{
echo "FUNCIONO!";
}
else
{
echo "Error #".mysql_errno().": ".mysql_error()."<br>";
}
echo "<a href='index.htm'>Error en el borrado</a>";
exit;

}

}




}
Buenas tardes,

Siento responder tan tarde. He estado realizando pruebas y finalmente lo hice como muestro:


$result=mysql_query("select * from albaranes",$link);
?>
<TABLE BORDER=1 CELLSPACING=1 CELLPADDING=1>
<TR>
<TD>&nbsp;<B>Indice</B></TD>
<TD>&nbsp;<B>Fecha</B></TD>
<TD>&nbsp;<B>Expedición</B></TD>
<TD>&nbsp;<B>Albaran</B></TD>
<TD>&nbsp;<B>Clientes</B>&nbsp;</TD>
<TD>&nbsp;<B>Población</B></TD>
<TD>&nbsp;<B>Estado</B></TD>
<TD>&nbsp;<B>Borrar</B>&nbsp;</TD>
</TR>
<?php

while($row = mysql_fetch_array($result)) {
printf("<td>&nbsp;%s</td><td>&nbsp;%s</td><td>&nbsp;%s</td><td>&nbsp;%s</td><td>&nbsp;%s</td><td>&nbsp;%s</td><td>&nbsp;%s</td><td><a href=\"eliminarDatos.php?id=%d\">Borrar</a></td></tr>",$row["id"], $row["fecha"], $row["expedicion"], $row["albaran"],$row["cliente"], $row["poblacion"], $row["estado"],$row["albaran"]);
}
mysql_free_result($result);
mysql_close($link);


?>


Y el archivo eliminarDatos.php seria

$indice=$_GET['id'];
mysql_query("DELETE FROM albaranes WHERE albaran = $indice",$link);
Ahora me pasa lo siguiente:

Puedo subir archivos tipo BLOB a la base de datos pero no me deja descargarlos. Ahi va el coódigo de descarga:

$result=mysql_query("select * from albaranes",$link);

$indice=$_GET['id'];


$qry = "SELECT archivo_tipo, archivo FROM albaranes WHERE id=$id";
$res = mysql_query($qry);
$binario_tipo = mysql_result($res, 0, "archivo_tipo");
$binario_archivo = mysql_result($res, 0, "archivo");

header("Content-type: $binario_tipo");
echo $binario_tipo;
echo $id;
echo $binario_archivo;


echo "<br>Listado de albaran correcto";
echo "<br><br><a href='areausuaris_ListarDatos.php'>Listar otro albaran</a>";
echo "<br><br><a href='index.htm'>Inicio</a>";



La base de datos la tengo como muestro

No es buena idea subir archivos de tipo BLOB cuando se puede hacer de otra forma. Por ejemplo, sería más eficiente guardar las imágenes en una carpeta y, en la base de datos sólo guardar el enlace hacia la imagen. Lo mismo para los archivos PDF, que si se guardan en una carpeta, basta con poner el enlace del archivo para que el usuario elija guardarlo (http://ejemplo.com/archivo.pdf abrirá el archivo y lo mostrará al usuario dándole la posibilidad de guardarlo).
Buenas tardes,

aunque estoy intentado hacer el cambio a: guardar las imágenes en una carpeta y, en la base de datos sólo guardar el enlace hacia la imagen, para otra aplicación con un volumen de datos mas importante. (por cierto, el link que me enviaste NO funciona)

Sigo intentando terminar esta aplicación para leer los archivos BLOB de la base de datos y NO HAY FORMA, me sale el codigo "raro" en la pantalla.

He estado revisando el código un monton de veces, pero aun haciendo muchas pruebas no doy con el error. Podeis ayudarme por favor???

$result=mysql_query("select * from albaranes",$link);

if(isset($_GET['id'])) {


$sql = "SELECT archivo,archivo_nombre,archivo_tipo,archivo_peso FROM albaranes WHERE id='".$_GET['id']."'";

$extensiones = array("application/msword"=>"doc","application/pdf"=>"pdf","image/jpeg"=>"jpg", "application/rar"=>"rar", "application/excel"=>"xls", "application/plain"=>"txt", "application/vnd.ms-powerpoint"=>"ppt");

$consulta = mysql_query($sql,$link);

$datos = mysql_result($consulta,0,"archivo");
$tipo = mysql_result($consulta,0,"archivo_tipo");
$nombre = mysql_result($consulta,0,"archivo_nombre");
$peso = mysql_result($consulta,0,"archivo_peso");


header("Content-type:'".$tipo."'");
header('Content-disposition: attachment; filename="'.$nombre.'.'.$extensiones[$tipo].'"');

echo $datos;
echo $nombre;
}

La base de datos es la siguiente:

Aquí hay una forma de hacerlo...

La base de datos se llama test y la tabla blob_test estructurada así:

CREATE TABLE blob_test (
  ID INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(200) NOT NULL,
  content LONGBLOB NOT NULL,
  mime VARCHAR(30) NOT NULL
) ENGINE=InnoDB;

index.php
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>Read/Write BLOB</title>
	</head>
	<body>
		<form action="save.php" enctype="multipart/form-data" method="post">
			<p><label>Archivo:</label> <input type="file" name="archivo" id="archivo" /></p>
			<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
			<input type="submit" value="Subir" name="upload" />
		</form>
	</body>
</html>

save.php
<?php
	if( isset( $_POST['upload'] ) ) {
		
		$name = $_FILES['archivo']['name'];
		
		if( move_uploaded_file( $_FILES['archivo']['tmp_name'], dirname( __FILE__ ) . "/$name" ) ) { // Mueve el archivo a la carpeta donde se encuentra el script save.php
			$file =	dirname( __FILE__ ) . "/$name";
			$c		= mysql_connect( 'dominio', 'usuario', 'contraseña' );
			mysql_select_db( 'test', $c );
			$mime	 = get_mime( $file );
			$blob	 = prepare( $file, $mime );
			$query = "INSERT INTO blob_test (name, content, mime) VALUES('$name', '$blob', '$mime')";
			$res	 = mysql_query( $query, $c );
			$err	 = mysql_error();
			
			if( empty( $err ) ) {
				//echo "<p>BLOB SAVED!</p>";
				include 'read.php';
			} else {
				echo "<p>Error: $err</p>";
			}
			
			mysql_close( $c );
		} else {
			echo "<p>Could not move uploaded file.</p>";
		}
	}
	
	function prepare( $file ) {
		$cont = file_get_contents( $file );
		$blob = addslashes( $cont );
		
		return $blob;
	}
	
	function get_mime( $file ) {
		$finfo = finfo_open(); /* Una función para extraer información sobre un archivo (podrías usas funciones para texto, pero ten en cuenta que, aunque un archivo tenga extensión pdf, este puede ser otro archivo, incluso puede ser un script dañino). Es más segura */
		$mime	 = finfo_file( $finfo, $file, FILEINFO_MIME_TYPE );
		finfo_close( $finfo );
		
		return $mime;
	}
?>

El siguiente archivo se encarga de leer desde la base de datos y procesar la presentación del contenido dependiendo del mime del archivo (solo incluí imágenes y pdf, pero es similar para los demás archivos):

read.php
<?php
	$query = "SELECT * FROM blob_test WHERE name = '$name'";
	$res	 = mysql_query( $query, $c );
	
	if( $res ) {
		$arr	= mysql_fetch_assoc( $res );
		$m		= explode( '/', $arr['mime'] ); // Separas el mime en 2 (si el mime es application/pdf, $m[0] será igual a applicacion y $m[1] = pdf)
		
		if( $m[0] == 'image' ) {
			$enc	= base64_encode( $arr['content'] );
			echo "<img src='data:image/$m[1];base64,$enc' />"; // Debería funcionar para cualquier imagen.
		} else if( $m[1] == 'pdf' ) {
			$pdf = dirname( __FILE__ ) . "/$arr[name].$m[1]";
			file_put_contents( $pdf, $arr['content'] );
			header( "Content-Type: $arr[mime]" );
			header( 'Content-Length: ' . filesize( $pdf ) );
			readfile( $pdf );
		}
	}
?>

Espero que te sirva :).