|
| Delete mange records med checkbox Fra : Jakob Munck |
Dato : 10-12-05 12:08 |
|
Jeg har lavet et mailsystem, hvor brugerne skal kunne slette deres indkomne
mails, som vises på en liste med checkbox's til højre. Det skal være sådan
at brugeren kan markere flere checkbokse for at slette flere mails ad
gangen, og derfor skriver jeg checkboxene sådan at id-nummeret på det brev,
som skal slettes, står i value-feltet i hver enkelt checkbox. Checkboxene er
naturligvis alle del af en Form.
<?
....
echo "<INPUT TYPE='checkbox' NAME='slet_mail' VALUE='<? echo $data[brev_id];
?>'>";
.....
?>
Spørgsmålet er så, hvordan jeg opsamler værdierne, når Formen afsendes? Det
vil jo dreje sig om flere forskellige id-numre, som skal slettes på én gang.
Og hvordan jeg skriver noget SQL, som sletter alle disse numre samtidig? Jeg
mener, at det handler om at bruge Arreys, men hvordan koden skriver til at
modtage disse id-numre ved formafsendelse og hvordan de indsættes i
sql-Delete-sætningen, ved jeg ikke.
Hvem kan hjælpe?
v.h.
Jakob
| |
jamen (10-12-2005)
| Kommentar Fra : jamen |
Dato : 10-12-05 12:45 |
|
Jakob Munck wrote:
> Jeg har lavet et mailsystem, hvor brugerne skal kunne slette deres indkomne
> mails, som vises på en liste med checkbox's til højre. Det skal være sådan
> at brugeren kan markere flere checkbokse for at slette flere mails ad
> gangen, og derfor skriver jeg checkboxene sådan at id-nummeret på det brev,
> som skal slettes, står i value-feltet i hver enkelt checkbox. Checkboxene er
> naturligvis alle del af en Form.
>
> echo "<INPUT TYPE='checkbox' NAME='slet_mail' VALUE='<? echo $data[brev_id];
Hvor du bruger []-syntaxen til at navngive dit formelement, så kan du i
php tilgå elementerne som et array:
<INPUT NAME='slet_mail[]' VALUE='xx'>
<?php $value = $_POST['slet_mail'][index] ?>
> Og hvordan jeg skriver noget SQL, som sletter alle disse numre samtidig?
Når du har valideret input fra brugeren, kan du lave en
$id = implode(",", $_POST['slet_mail']);
$sql = "delete from tabel where id in ($id)";
| |
Jakob Munck (10-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 10-12-05 13:49 |
|
Jeg ved ikke om jeg har forstået dig rigtigt, men det virker ikke, som jeg
har lavet det.
Check-boxen i Formen, er lavet sådan:
<?
//måske forkert??.
echo "<INPUT TYPE='CHECKBOX' NAME='slet_mail[<? echo $data[id]; ?>]'>";
....
?>
og jeg forsøger at modtage Arrey med relevante id-numre sådan:
$id = implode(",", $_POST['slet_mail']);
$sql = "DELETE FROM tbletters WHERE let_id in ($id)";
Når jeg vælger nogle records og chekker dem af på listen og sender formen,
sker der intet. Ingen records slettes og jeg får ingen fejlmelding. Altså
gør jeg noget forkert, men hvad?
v.h.
Jakob
| |
jamen (10-12-2005)
| Kommentar Fra : jamen |
Dato : 10-12-05 14:35 |
|
Jakob Munck wrote:
> Check-boxen i Formen, er lavet sådan:
>
> echo "<INPUT TYPE='CHECKBOX' NAME='slet_mail[<? echo $data[id]; ?>]'>";
prøv sådan:
echo "<INPUT TYPE='CHECKBOX' NAME='slet_mail[]' VALUE='<? echo
$data[id]; ?>'>";
Således alle værdierne får det samme navn. I php kan du prøve at teste med:
foreach($_POST['slet_mail'] as $value){
echo "$value<br>";
}
hvis den echo'er de valgte id'er, så virker det
| |
Jakob Munck (10-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 10-12-05 21:44 |
|
> foreach($_POST['slet_mail'] as $value){
> echo "$value<br>";
> }
Desværre, det virker ikke. Fejlmelding: "Invalid argument supplied for
foreach() in ..."
>
> $i = implode(",", $_POST['slet_mail']);
Det virker heller ikke. Fejlmelding: "Bad arguments..."
Har søgt efter færdig kode, der virker, men kun fundet noget, som sletter
den sidste valgte record, men ikke de andre. Det ser sådan ud:
<?
//$colname_r = "%";
if (isset($_POST['slet_mail'])) {
$colname_r = (get_magic_quotes_gpc()) ? $_POST['slet_mail'] :
addslashes($_POST['slet_mail']);
}
$sql = @mysql_query("DELETE FROM tbletters WHERE let_id
IN(".str_replace(",","','", $colname_r).") ");
?>
Det går altså ikke så godt. Konkret hjælp med noget som virker, efterlyses.
v.h.
Jakob
| |
jamen (10-12-2005)
| Kommentar Fra : jamen |
Dato : 10-12-05 22:36 |
|
Jakob Munck wrote:
> Desværre, det virker ikke. Konkret hjælp med noget som virker, efterlyses.
Eksempel:
<?php
if($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['slet_mail'])){
if(is_array($_POST['slet_mail'])){
echo "sletter mails med følgende id: <br>";
foreach($_POST['slet_mail'] as $value){
echo "$value <i>slettet</i><br>";
}
$id = implode(",", $_POST['slet_mail']);
$sql = "delete from tabel where id in ($id)";
echo "<br>sql: $sql<br><br><hr>";
}else{
echo "slet_mail er ikke et array, noget gik galt<br>";
}
}
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
1: <input type="checkbox" name="slet_mail[]" value="1"><br>
2: <input type="checkbox" name="slet_mail[]" value="2"><br>
3: <input type="checkbox" name="slet_mail[]" value="3"><br>
<input type="submit" value="slet nu">
</form>
| |
Jakob Munck (10-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 10-12-05 23:59 |
|
Hejsa
jeg takker for din hjælp, men desværre virker det endnu ikke. Jeg er ret
sikker på at problemet ligger et sted i disse 2 sætninger:
$id = implode(",", $_POST['slet_mail']);
$sql = "DELETE FROM tbletters WHERE let_id IN ($id)";
Indtil da, går alt nemlig godt. Den fører værdierne op, men der slettes
ingen records. Derfor tror jeg at fejlen ligger et sted i en af disse 2
sætninger.
Her er min samlede kode:
---------------------------------------------------------------
<?
session_start();
if (!isset($_SESSION[medl_id])) {
header("Location: no_entrance.php");
}
include "top1.inc.php";
include "database.inc.php";
include "menu.inc.php";
include "top2.inc.php";
if (!isset($_SESSION[user_name])) {
header("Location: no_entrance.php");
}
///////////////////////////////////////////////////////////////
if(is_array($_POST['slet_mail'])){
/*
//lister de rigtige værdier:
foreach($_POST['slet_mail'] as $value){
echo "$value <i>slettet</i><br>";
}
*/
//her er problemet, virker ikke:
$id = implode(",", $_POST['slet_mail']);
$sql = "DELETE FROM tbletters WHERE let_id IN ($id)";
}
////////////////////////////////////////////////////////////////
?>
<br>
<center>
<font face="Verdana, Arial Helvetica" size="5" color="#606060">
Letters - Outbox
</font>
<br><br>
<a href="head_menu.php" class="normal">Main-menu</a>
</center>
<br>
<FORM METHOD="POST" ACTION="<? echo $PHP_SELF; ?>">
<?
$data2=mysql_query("SELECT * FROM tbletters");
$antal = mysql_num_rows($data2);
$sql = mysql_query("SELECT * FROM tbletters ORDER BY let_id");
echo "<table width='80%' align='center' border='1' cellpadding='2'
cellspacing='0' bordercolor='cccccc'>";
echo "<td width='6%' bgcolor='a0a0a0' class='hvid11'>No.</td>";
echo "<td width='32%' bgcolor='a0a0a0' class='hvid11'>Reciever</td>";
echo "<td width='30%' bgcolor='a0a0a0' class='hvid11'>Subject</td>";
echo "<td width='20%' bgcolor='a0a0a0' class='hvid11'>Time</td>";
echo "<td width='6%' bgcolor='a0a0a0' class='hvid11'>Status</td>";
echo "<td width='6%' bgcolor='a0a0a0' class='hvid11'>Slet</td></tr>";
$i = 0;
while($data = mysql_fetch_array($sql)){
$i++;
if ($i % 2 == 0){
echo "<tr bgcolor='cccccc'><td class='sort11'>";
echo $i;
echo "</td><td>";
$sql2 = mysql_query("SELECT * FROM tbmembers WHERE medl_id =
'$data[reciever_id]'");
$data2 = mysql_fetch_array($sql2);
echo "<a href='profile_show.php?i=$data[reciever_id]'
class='normal'>$data2[user_name]</a>";
echo "</td><td class='sort11'>";
echo "<a href='letter_out_read.php?i=$data[let_id]'
class='normal'>$data[subject]</a>";
echo "</td><td class='sort11'>";
echo date("j-n/Y", strtotime($data["send_time"]));
echo "</td><td class='sort11'>";
echo $data[status];
echo "</td><td class='sort11'>";
echo "<INPUT TYPE='checkbox' NAME='slet_mail[]' VALUE='$data[let_id]';>";
echo "</td></tr>";
}
else
{
echo "<tr bgcolor='ffffff'><td class='sort11'>";
echo $i;
echo "</td><td>";
$sql2 = mysql_query("SELECT * FROM tbmembers WHERE medl_id =
'$data[reciever_id]'");
$data2 = mysql_fetch_array($sql2);
echo "<a href='profile_show.php?i=$data[reciever_id]'
class='normal'>$data2[user_name]</a>";
echo "</td><td class='sort11'>";
echo "<a href='letter_out_read.php?i=$data[let_id]'
class='normal'>$data[subject]</a>";
echo "</td><td class='sort11'>";
echo date("j-n/Y", strtotime($data["send_time"]));
echo "</td><td class='sort11'>";
echo $data[status];
echo "</td><td class='sort11'>";
echo "<INPUT TYPE='checkbox' NAME='slet_mail[]' VALUE='$data[let_id]';>";
echo "</td></tr>";
}
}
echo "</tr>";
echo "</table>";
echo "<br><br><center><INPUT class='submit' style='WIDTH: 120px'
type='submit' value='Delete letters !'></center></FORM>";
include "bottom.inc.php";?>
----------------------------------------------------------------
Hvis nogen kan finde fejlen, bliver jeg meget glad.
v.h.
Jakob
| |
jamen (11-12-2005)
| Kommentar Fra : jamen |
Dato : 11-12-05 00:15 |
|
Jakob Munck wrote:
> //her er problemet, virker ikke:
> $id = implode(",", $_POST['slet_mail']);
> $sql = "DELETE FROM tbletters WHERE let_id IN ($id)";
Jeg kan ikke få øje på, hvor du beder mysql afvikle din sql..
mysql_query($sql);
Som jeg vist også har nævnt tidligere i tråden, skal du huske at
beskytte dig selv (mod sql injection), og validere input fra brugeren.
Det kan du gøre ved gennemløb af arrayet. Jeg ville gøre noget i stil med:
$real_id = array();
foreach($_POST['slet_mail'] as $value){
if(!is_numeric($value)){
//echo "siden bliver forsøgt hacket";
exit();
}
$real_id[] = (int)$value;
}
$id = implode(",", $real_id);
$sql = "DELETE FROM tbletters WHERE let_id IN ($id)";
mysql_query($sql);
| |
Jakob Munck (11-12-2005)
| Kommentar Fra : Jakob Munck |
Dato : 11-12-05 08:40 |
|
Igen, tusind tak for din hjælp.
>> //her er problemet, virker ikke:
>> $id = implode(",", $_POST['slet_mail']);
>> $sql = "DELETE FROM tbletters WHERE let_id IN ($id)";
>
> Jeg kan ikke få øje på, hvor du beder mysql afvikle din sql..
>
> mysql_query($sql);
>
Sådan! Det var lige det som manglede. Så virker det.
>
> Som jeg vist også har nævnt tidligere i tråden, skal du huske at beskytte
> dig selv (mod sql injection), og validere input fra brugeren. Det kan du
> gøre ved gennemløb af arrayet. Jeg ville gøre noget i stil med:
>
>
> $real_id = array();
>
> foreach($_POST['slet_mail'] as $value){
> if(!is_numeric($value)){
> //echo "siden bliver forsøgt hacket";
> exit();
> }
> $real_id[] = (int)$value;
> }
>
> $id = implode(",", $real_id);
> $sql = "DELETE FROM tbletters WHERE let_id IN ($id)";
> mysql_query($sql);
Naturligvis skal man beskytte sig. Men ovenstående kode gav fejlmelding hos
mig, så jeg lavede i stedet en lille ændring, således:
<?
if(is_array($_POST['slet_mail'])){
$id = implode(",", $_POST['slet_mail']);
if(!is_numeric($id)){
echo "Visito turns ower any case of attempted hacking to the police!";
exit();
}
$sql = "DELETE FROM tbletters WHERE let_id IN ($id)";
mysql_query($sql);}
?>
Og så virkedede det, samtidig med at alle ikke-numeriske værdier holdes ude.
Men det at undgå faren for sql-injection er jo et (endnu) større problem,
når der er tale om formfelter, som skal udfyldes, f.eks. logins o.a. Hvad er
den letteste måde at sikre sig mod denne fare? Hvad for en streng skal man
skrive, for at bortsortere de "farlige tegn"?
v.h.
Jakob
| |
|
|