Ayuda en PHP

shortyStyle

Hola a todos, soy un principiante en PHP, y estoy haciendo unas pruebas, talleres, para ir aprendiendo, pero hay uno que no me sale y me trae de cabeza.

Tengo una base de datos en mysql con una tabla llamada canciones con los campos codigocancion, titulo, autor, duracion.

Lo que quiero hacer es algo básico, tengo varios formularios en una web, uno para dar de alta una canción, otro para modificar canción y otro para eliminar una canción, y luego un cuadro mostrando todas.

Todos los formularios me funcionan excepto el último, que no soy capaz de eliminar la canción.

Os dejo el código:

<?php

if(empty($_POST["codigocancion"])){
echo "Debes introducir el codigo para poder modificarlo";
echo '<a href="musicos.php">Volver atrás</a>';
}

else{
$codigocancion=$_POST["codigocancion"];

$link=mysql_connect("localhost","root","");

$result=mysql_db_query ("musicos","select * from repertorio where CodigoCancion=$codigocancion");

$x=0;

while($row=mysql_fetch_array($result)){

	if($row["CodigoCancion"]==$codigocancion){

		$x=1;
		mysql_db_query("musicos","delete * from repertorio where CodigoCancion=$codigocancion");
		echo "Cancion eliminada!<br>";
		echo '<a href="musicos.php">Volver atrás</a>';

	}
}

if($x==0){

		echo "Ese codigo de cancion no existe o es incorrecto!<br><br>";
		echo '<a href="musicos.php">Volver atrás</a>';
		}

mysql_free_result($result);
mysql_close($link);

}
?>

El caso es que me entra en la condición bien y me da el echo de "Canción eliminada" pero no hace nada en la bbdd.

Ya no se que cambiarle, si alguno viera el fallo o pudiera ayudarme se lo agradeceria mucho.

Gracias y saludos :>

erdanblo

mysql_db_query? eso es nuevo? :o

SnAoW

no lo he mirado detenidamente, pero creo que el fallo puede estar en:

$result=mysql_db_query ("musicos","select * from repertorio where CodigoCancion=$codigocancion");

y en otros sitios dónde haces consultas MYSQL, tienes que poner:

...where CodigoCancion='$codigocancion'");

las comillas en $codigocancion , no se si será eso pero prueba

shortyStyle

seguro que hay muchas funciones más que lo que estoy haciendo lo hacen más sencillo pero las desconozco, es questión de ponerse a buscarlas por internet.

Pero cuando hice lo mismo para modificar las base de datos con un update me funcionó a la perfección (haciéndolo prácticamente igual que el delete)

#3 Eso ya lo probé y no funcionó, gracias de todas formas.

SeiYa

#4 es DELETE FROM sin el asterisco.

W

mysql_query("DELETE * FROM repertorio WHERE codigocancion=$codigocancion",$link);
$envia=mysql_query("SELECT * FROM repertorio WHERE codigocancion=$codigocancion",$link)
if(mysql_return($envia)){

$info="No se ha borrado la cancion.";
} else {
$info="Se ha borrado la cancion correctamente.";
}

echo $info;

Asi podria funcionar no? Perdonar si hay algun fallo xD.

Por cierto aprovecho para preguntar una cosilla que tengo en mente, quizas alguien ya lo haya pensado (seguro que si), y me gustaria saber que os parece.

Hay muchas web que hacen un shitch (x ejemplo)

<?php
switch($_REQUEST['s']){
case "login":
include("usuario/identificar.php");
break;
case "logout":
session_unset();
$info="Se ha cerrado la sesión correctamente. Gracias y vuelve cuando quieras.";
break;
default:
break;
}
?>

Lo malo de esto es que cada vez que añadimos una seccion tenemos que ir al index.php y añadirlo manualmente.

Lo que tengo en mente es...

creamos una tabla llamada "seleccion" mismo en la base de datos, con los siguientes valores.

ID (integer autoincrement)
seccion (varchar)
archivo (varchar)

en el php en vez de poner ese switch ponemos

if(isset($_POST['mod'])) {

$envia=mysql_query("SELECT * FROM seleccion WHERE seccion=$_POST['mod']",$conexion)
if($dato=mysql_result($envia))
{
include($dato['archivo']);
} else {
include("noticias.php");
}

Si hay algun fallo de sintaxis decirmelo por favor es que yo utilizo otra forma y he intentado ponerlo de la forma corriente. Gracias.

En resumen, que en vez de estar el switch en el .php este en una base de datos, asi si queremos añadir una nueva seccion lo podriamos hacer directamente desde la propia web, creando un formulario de entrada.

SeiYa

Joder, no me leen ? xD

El fallo está en el * (ASTERISCO) del DELETE * FROM, la sentencia correcta es:

DELETE FROM tabla WHERE condicion.

C

Creo q seiya tiene razon aunque no descarto los demas fallos... tampoco he leido mucho pero me acuerdo en mis clases de sql que meti la pata poniendo DELETE * FROM y me sonaba raro que no funcionase, mi profesora me dijo que eso en mysql no funcionaba pero que creia que en sql standard si, espero haber sido de ayuda

shortyStyle

#7 El * es para indicarle que lo borretodo, y no ningún campo en especial.

cabron

#9:

El DELETE no es como el SELECT. En un SELECT tú pones lo que quieres que te devuelva, y si quieres que te devuelva todo, pones un *.

En un DELETE, siempre se borra todo. No puedes borrar medio registro, o solo X columna del registro. Los registros se borran siempre completos. El * está mal como ya te han dicho.

Si solo quieres dejar en blanco parte de un registro, necesitas hacer un UPDATE a las columnas que quieras, DELETE te borra siempre el registro entero.

SeiYa

#9 Ahora lees a #10 y me dices.

Prueba la solución anda.

Anbus

#10

Hay formas de eliminar el contenido de una columna, aunque depende del factor de que dicho campo puede tener valor NULL, seria por ejemplo:

UPDATE tabla SET campo='NULL' WHERE referencia='x'; o,

UPDATE tabla SET campo='' WHERE referencia='x'

Con esto se consigue eliminar el contenido de un registro sin necesidad de borrarlo entero y volver a introducirlo con los datos que nos interesen, esto se usa mucho por ejemplo, en las bases de datos de registros de usuarios, los campos de Userid, nombre, pw, email, pueden ser obligatorios y por lo tanto NOT NULL, pero el resto como nombre y apellidos reales, fecha de nacimiento, email alternativo, etc, no es necesario su introducion, asi que pueden tener valor NULL.

Yo, personalmente, soy partidario de que en la creacion de la db solo se pongan como NOT NULL aquellos campos que son obligatoriamente necesarios.

Espero que esto ayude a alguien, quoteo a #10 simplemente para extender la informacion que dio.

Por cierto, intenta usar mysql_query, ya que es una funcion mas antigua de php y no da problemas, te lo dice alguien que ha tenido quebraderos con session_unset() y session_destroy(). Si sabemos que algo funciona como estaba es mejor no usar las funciones nuevas si no nos van a dar beneficio.

Lo mismo digo para mysql_result, prueba con mysql_fetch_row

SeiYa

De todas formas no es por las funciones ya sabéis porqué es XD

shortyStyle

#10 No sabia que sin el * funcionaba, de todas formas, desde que he empezado con sentencias sql siempre he podido hacer un delete * y me ha funcionado correctamente, lo probaré por si acaso, gracias.

SeiYa

Quizás no usabas mysql ... de todas formas, no es que sin el asterisco también te deje, es que te deja en algunos sitios con el asterisco, la forma correcta es sin el.

kas

Standar SQL-92:

http://www.contrib.andrew.cmu.edu/shadow/sql/sql1992.txt

cito:

13.6 <delete statement: positioned>

     Function

     Delete a row of a table.

     Format

     <delete statement: positioned> ::=
          DELETE FROM <table name>
            WHERE CURRENT OF <cursor name>

Es decir, el standar sql no admite * entre DELETE y FROM. Que uses un gestor que lo ignore no quiere decir que sea correcto.

SeiYa

#16 lo que he dicho yo XD

shortyStyle

SeiYa gracias por la información, apartir de ahora no usaré el *.

Por cierto ya está solucionado, no era problema del * (o al menos de momento) era problema de las claves foráneas, y de las otras tablas, ya que al definirlas las había creado con el "on delete restrict" y por eso no me permitia eliminar cosas de otras tablas, lo cambié por un "on delete cascade" y ya me funciona.

Gracias a todos por las aclaraciones y demás :)

W

Aprovecho post para ver si me podeis ayudar con un problema que tengo.

Haber yo tengo este codigo

$cmttexto = str_replace("", "",$comentario['cmt_texto']);
$cmttexto = str_replace("
", "
",$comentario['cmt_texto']);

$cmttexto = str_replace("", "",$comentario['cmt_texto']);

$cmttexto = str_replace("
", "
",$comentario['cmt_texto']);

$cmttexto = str_replace("", "",$comentario['cmt_texto']);

$cmttexto = str_replace("
", "
",$comentario['cmt_texto']);

Que lo que hace es remplazar los valores por codigo HTML, bien el problema y question del asunto es que claro, cuando es un codigo pequeño pues no hay problema, pero cuando tengo que pasar todos los datos de una noticia (cabecera & texto) es un coñazo poner este codigo e ir cambiando la variable a la que hace efecto. Sin contar que con los articulos tengo que hacer lo mismo.

Me he mirado las funciones pero no me entero de una cosa.

function suma ($x, $y)

{

$x = $x + 1;

return $x+$y;

}

$a = 1;

$b = 2;

//parámetros por valor

echo suma ($a, $b); // imprimirá 4

echo $a; // imprimirá 1

//parámetros por referencia

echo suma (&$a, $b); // imprimirá 4

echo $a; //imprimirá 2

Siguiendo el tipo de la funcion la mia seria

function transformartexto ($xxxxx) {

$xxxx = str_replace("", "",$xxxx);
$xxxx= str_replace("
", "
",$xxx);

return $xxxx;
}

O como seria, donde la XXXX que tendria que poner para que sepa que es una variable que le pasare (la cual puede cambiar el nombre, puede ser $texto, $cabecera.

Gracias.

W

Luego aparte tengo este codigo que no se porque no me funciona del todo bien.

$sql2="SELECT * FROM comentarios_not WHERE cmt_notid=".$_GET['id'];
$envia2=mysql_query($sql2,$conexion);
if(mysql_query($sql2,$conexion)) {

while($comentario=mysql_fetch_assoc($envia2)) {

	echo "<DIV> </DIV>";
		echo "<DIV align='left' class='headlines2'>".$comentario['cmt_login']." a las ".$comentario['cmt_fecha'].", dijo:</DIV>";
		echo "<br><DIV align='left'>".$cmttexto."</DIV>";

		}	

} else {
	echo "No hay ningún comentario en esta noticia.";
    }

Hago una consulta a los comentarios con el id de la noticia pasado por GET para ver si hay comentarios, si los hay, hago un while sacando y mostrando 1 a 1 los resultados, si no hay, pondra "No hay ningun comentario en esta noticia".

Resulta que si hay comentarios me los muestra, pero si no hay, no dice nada...

SeiYa

#20

mysql_query siempre devuelve TRUE si se hace bien la consulta, devuelve FALSE si hay error en la consulta.

Tu consulta devuelve TRUE porque no tiene error, otra cosa es que devuelva o no resultados.

No tienes que preguntar a mysql_query sino a mysql_num_rows(); pasándole por argumento el resultado de mysql_query(); y te devolverá el número de comentarios que hay, 0 si no hay ninguno obviamente.

W

XD ya ya eso me di cuenta ayer cuando al final desconecte xD, lo tipico cegao que no lo ves y cuando desconectas te viene la inspiracion, al final lo hice como tu acabas de decir. por cierto en el #19 sabeis algo? es que es un coñazo estar poniendo cada 2 x 3 eso y si se pudiera automatizar pues de lujo

SeiYa

Si te he entendido bien en #19 creo que esto te servirá:

function Reemplazar($texto)
{
$cmttexto = str_replace("", "",$texto);
$cmttexto = str_replace("
", "",$cmttexto);
$cmttexto = str_replace("", "",$cmttexto);
$cmttexto = str_replace("
", "",$cmttexto);
$cmttexto = str_replace("", "",$cmttexto);
$cmttexto = str_replace("
", "",$cmttexto);
return $cmttexto;
}

Y cuando quieras pues algo como:

echo Reemplazar($comentario['cmt_texto']);

No te lies tanto.

W

pues muchas gracias :)

Usuarios habituales