[Gelöst] mysql DELETE mit checkboxen
am 03.10.2010 - 10:07 Uhr in
Hallo,
ich habe mir eine Form gebastelt die mittels DB Abfrage checkboxen ausgibt. Die selektierten einträge möchte ich gerne nach dem Submit aus der DB entfernen. Leider komm ich grade nicht wirklich weiter.
<?php
function module_settings_server_delete($form_state_delete) {
$form = array();
$form['module_settings_server_delete'] = array(
'#type' => 'fieldset',
'#title' => t('Delete Server'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$db_server = db_query("SELECT id, name FROM {module_server}");
while ($server = db_fetch_array($db_server)) {
$form['module_settings_server_delete']['delete'][$server['name']] = array(
'#type' => 'checkbox',
'#title' => $server['name'],
'#name' => $server['name'],
);
}
$form['module_settings_server_delete']['submit'] = array('#type' => 'submit', '#value' => t('Delete'));
return $form;
}
function module_settings_server_delete_submit($form, &$form_state_delete) {
foreach ($form_state_delete['values'] AS $value) {
if ($value = 1) {
db_query("DELETE FROM {module__server} WHERE id = '".$form['values']['id']."'");
drupal_set_message( t('Server deleted.') );
}
}
}
?>Nach dem Submit bekomme ich je nach dem wie viele checkboxen angezeigt wurden auch dementsprechend viele Erfolgsmeldungen [drupal_set_message( t('Server deleted.') );]. Nur leider wird nichts gelöscht aus der Datenbank. Was mach ich da falsch?
- Anmelden oder Registrieren um Kommentare zu schreiben

Hi also das Modul sieht
am 03.10.2010 - 10:31 Uhr
Hi also das Modul sieht soweit gut aus
nur der DB query zum löschen gibt mir zu denken.
die Klammer {module__server} besagt, dass die Datenbank
evtl. prefix_module__server heisst.
wenn du dir nicht sicher bist gib hier den genauen Namen der Tabelle
ohne {} an.
(Hat der Name der Tabelle wirklich 2 unterstriche?)
db_query("DELETE FROM {module__server} WHERE id = '".$form['values']['id']."'");
2. Probier doch den DELETE in phpmysql.
Falls der Tabellentyp InnoDB ist kann es auch sein dass Du nicht
löschen kannst weil Du eine Referenz verletztet.
(Der Datensatz wird noch von einer anderen Tabelle referenziert)
phpmyadmin wird Dir da jedenfalls bescheid sagen.
LG
Zitat: db_query("DELETE FROM
am 03.10.2010 - 11:56 Uhr
db_query("DELETE FROM {module__server} WHERE id = '".$form['values']['id']."'");
Sowas macht man übrigens gar nicht, sondern man verwendet Platzhalter und ersetzt diese dann:
<?phpdb_query("DELETE FROM {module__server} WHERE id = '%s';", $form['values']['id']);
?>
So habe ich es im
am 03.10.2010 - 12:48 Uhr
So habe ich es im Moment:
<?php
function whm_settings_server_delete($form_state_delete) {
$form = array();
$form['whm_settings_server_delete'] = array(
'#type' => 'fieldset',
'#title' => t('Delete Server'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$db_server = db_query("SELECT id, name FROM {whm_server}");
while ($server = db_fetch_array($db_server)) {
$form['whm_settings_server_delete']['delete'][$server['name']] = array(
'#type' => 'checkbox',
'#title' => $server['name'],
'#name' => $server['name'],
);
}
$form['whm_settings_server_delete']['submit'] = array('#type' => 'submit', '#value' => t('Delete'));
return $form;
}
mysql_connect("localhost", "web20_admin", "********");
mysql_select_db("web20_drupal");
function whm_settings_server_delete_submit($form, &$form_state_delete) {
foreach ($form_state_delete['values'] AS $value) {
if ($value = 1) {
mysql_query("DELETE FROM whm_server WHERE id = '".$form['values']['id']."'")
or die(mysql_error());
#db_query("DELETE FROM whm_server WHERE id = '%s'", $form['values']['id']);
#drupal_set_message( t('Server deleted.') );
}
}
}
?>
Bekomme da irgendwie garkeine Fehlermeldung oder irgendwas...
ich hab mir mal $value ausgeben lassen:
<?php
echo '<pre>';
print_r($value);
echo '</pre>';
?>
schaut so aus:
0
0
0
1
0
0
0
0
0
Delete
Delete
form-08fdc7017abbe6a9a62a237d6fc7cfaf
68507d7488b9aaba002c8b0772c29aff
whm_settings_server_delete
Du machst aber mitunter auch
am 03.10.2010 - 13:10 Uhr
Du machst aber mitunter auch ein paar echt seltsame Sachen...
mysql_connect("localhost", "web20_admin", "********");
mysql_select_db("web20_drupal");
Das brauchst du schonmal gar nicht, da Drupal ohnehin mit der Datenbank verbunden ist. Also raus damit.
foreach ($form_state_delete['values'] AS $value)
Warum du das machst ist mir auch relativ unklar. Damit überprüfst du alle Values des Formulars, obwohl du nur die Checkboxen überprüfen willst. Also begrenze das ganze doch auf die Checkboxen und wirf unnötigen Ballast ab.
if ($value = 1)
Diese Zeile wird sogut wie immer TRUE ergeben, denn die Variable $value mit 1 zu belegen klappt fast immer... Wenn du allerdings prüfen willst, ob die Variable den Wert 1 hat, dann sollte das so aussehen:
if ($value == 1)
(Man beachte das zweite =-Zeichen)
mysql_query("DELETE FROM whm_server WHERE id = '".$form['values']['id']."'")
or die(mysql_error());
Lass das weg und nimm die Datenbank-Funktionen von Drupal.
Außerdem gibt mir die SQL-Anweisung sehr zu denken... Was genau steht denn in der MySQL-Tabelle als ID? Und ich frage mich, woher du den Wert $form['values']['id'] nimmst, denn der ist mir gänzlich unbekannt.
Exterior hat in allen Punkten
am 03.10.2010 - 13:28 Uhr
Exterior hat in allen Punkten recht.
Du holst zwar mit select id,name die id aber die wird nirgends
in deiner From verwendet!
Falls Du tatsächlich multiselect checkboxen hast müsste
dein fieldset mit checkboxes sollte irgendwo ein multiple
Attribut haben.
Denn so kannst Du nur ein checkboxfeld auswählen.
dass erkärt für mich die 0 0 0 0 0 0 1 0 0 0 0 in den Values.
Die id wird wie Exterior schon sagt gar nirgends in deiner Form übergeben
und kann daher auch nicht im DELETE verwendet werden.
TIPP:
Lass Dir mal das komplette Statement ausgeben.
$sql=sprintf("DELETE FROM whm_server WHERE id = '%s'",$form['values']['id']);
print $sql;
oder
drupal_set_message($sql);
db_query($sql);
LG
In der Tabelle stehen
am 03.10.2010 - 13:30 Uhr
In der Tabelle stehen nummern:
`id` int(2) unsigned NOT NULL auto_incrementJa, name ist natürlich unbekannt, mein Fehler. Hab es jetzt so:
<?php
function whm_settings_server_delete($form_state_delete) {
$form = array();
$form['whm_settings_server_delete'] = array(
'#type' => 'fieldset',
'#title' => t('Delete Server'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$db_server = db_query("SELECT id, name FROM {whm_server}");
while ($server = db_fetch_array($db_server)) {
$form['whm_settings_server_delete']['delete'][$server['id']] = array(
'#type' => 'checkbox',
'#title' => $server['name'],
'#name' => $server['id'],
);
}
$form['whm_settings_server_delete']['submit'] = array('#type' => 'submit', '#value' => t('Delete'));
return $form;
}
function whm_settings_server_delete_submit($form, &$form_state_delete) {
foreach ($form_state_delete['values'] AS $value) {
if ($value == 1) {
db_query("DELETE FROM {whm_server} WHERE id = '%s'", $form['values']['id']);
drupal_set_message( t('Server deleted.') );
}
}
}
?>
Bekomme aber nach wie vor die Erfolgsmeldung "drupal_set_message( t('Server deleted.') );" aber es wir nichts gelöscht in der DB.
1. Ich sagte bereits Du
am 03.10.2010 - 14:04 Uhr
1.
Ich sagte bereits Du sollst Dir
mal das SQL das du ausführen möchtest ausgeben lassen.
Hier siehst Du warscheinlich dass die IDs gar nicht so übergeben werden
2. DeinFieldset mit Checkboxen ist ein Single select.
Die checkboxes müssten für mehrfachauswahl das Attribut "multiple" beinhalten.
In Deiner Funktion gib mit print_r oder var_dump die form aus damit Du siehst was überhaupt übergeben wird.
Wichtiger ist aber sich das SQL anzeigen zu lassen wie ich es schon sagte.
Denn bie Dir ist 100% das DELETE Statement nicht korrekt.
function whm_settings_server_delete_submit($form, &$form_state_delete) {
print_r($form,TRUE)
}
LG
Zitat: 2. DeinFieldset mit
am 03.10.2010 - 14:28 Uhr
2. DeinFieldset mit Checkboxen ist ein Single select.
Die checkboxes müssten für mehrfachauswahl das Attribut "multiple" beinhalten.
Das stimmt so nicht. Er legt in einem foreach-Statement mehrere Checkboxen an und die gelten alle als einzelne Formular-Elemente und werden alle separat ausgewertet. Soweit stimmt das schon.
Aber das $form['values']['id'] ist eben völliger Unsinn.
Und wie du dazu kommst, an die Checkboxen das Attribut #name zu vergeben erschließt sich mir auch nicht so recht.
Pass auf, Vorschlag:
<?php
function whm_settings_server_delete($form_state_delete) {
$form = array();
$form['whm_settings_server_delete'] = array(
'#type' => 'fieldset',
'#title' => t('Delete Server'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#tree' => TRUE //nötig für Verschachtelung!
);
$db_server = db_query("SELECT id, name FROM {whm_server}");
while ($server = db_fetch_array($db_server)) {
$form['whm_settings_server_delete']['delete'][$server['id']] = array(
'#type' => 'checkbox',
'#title' => $server['name'],
'#return_value' => $server['id'],
//Damit gibt die Checkbox nicht 1 zurück, wenn sie angewählt ist, sondern die Server-ID
);
}
$form['whm_settings_server_delete']['submit'] = array('#type' => 'submit', '#value' => t('Delete'));
return $form;
}
function whm_settings_server_delete_submit($form, &$form_state_delete) {
foreach ($form_state_delete['values']['whm_settings_server_delete']['delete'] AS $value) {
if ($value != 0) {
db_query("DELETE FROM {whm_server} WHERE id = '%s'", $value);
drupal_set_message( t('Server deleted.') );
}
}
}
?>
So könnte das aussehen. Ich warne ganz ausdrücklich davor, das per copy&paste zu übernehmen, denn ich habe gerade nicht genau die Array-Struktur im Kopf und evtl. klappt das nicht. Aber so könnte das aussehen, das was du da oben gemacht hast klappt hinten und vorn nicht.
Die Variante setzt übrigens voraus, dass es keine ID "0" in der Datenbank gibt.
Und zu guter letzt: Du solltest dich evtl. nochmal richtig mit der Form API auseinandersetzen, denn du machst mitunter echt seltsame Sachen (z. B. Attribute an Form-Elemente vergeben, die diese gar nicht erhalten dürfen).
Danke!! So funktioniert es
am 03.10.2010 - 14:54 Uhr
Danke!! So funktioniert es jetzt:
<?php
function whm_settings_server_delete($form_state_delete) {
$form = array();
$form['whm_settings_server_delete'] = array(
'#type' => 'fieldset',
'#title' => t('Delete Server'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#tree' => TRUE
);
$db_server = db_query("SELECT id, name FROM {whm_server}");
while ($server = db_fetch_array($db_server)) {
$form['whm_settings_server_delete']['delete'][$server['id']] = array(
'#type' => 'checkbox',
'#title' => $server['name'],
'#return_value' => $server['id'],
);
}
$form['whm_settings_server_delete']['submit'] = array('#type' => 'submit', '#value' => t('Delete'));
return $form;
}
function whm_settings_server_delete_submit($form, &$form_state_delete) {
foreach ($form_state_delete['values']['whm_settings_server_delete']['delete'] AS $value) {
if ($value != 0) {
db_query("DELETE FROM {whm_server} WHERE id = '%s'", $value);
drupal_set_message( t('Server '.$value.' deleted.') );
}
}
}
?>
Obwohl ich mich frage warum Du '#return_value' mit der id belegst.
in der Form API steht "Description: Value element should return when selected"
Ich bin davon ausgegangen das man das so angibt:
'#return_value' => 1,
und nur wenn die checkbox auch gechecked ist wir 1 zurückgegeben, sonst 0.
Man kann als return_value
am 03.10.2010 - 15:01 Uhr
Man kann als return_value angeben, was man will, standardmäßig ist dort die Zahl 1 eingetragen.
Und wenn man die Checkbox anwählt, wird dieser return_value zurückgegeben und wenn die Box nicht gewählt wurde, erhält man 0.
Somit gibt die Checkbox die Server-ID zurück, wenn man sie anwählt. Das ist der schnellste Weg, um zuverlässig über die Form-Values an diese Server-ID zu kommen.
Verstehe, habe das wohl
am 03.10.2010 - 15:09 Uhr
Verstehe, habe das wohl falsch interpretiert.
Danke für eure Hilfe!
@Exterior hi das mit den
am 03.10.2010 - 17:48 Uhr
@Exterior
hi das mit den Checkboxen als einzelne Form Elemente
ist ganz schlechter Stil.
Immerhin ist das in HTML schon festgelegt.
Ohne allzu tief gehen zu wollen werden die Checkboxen
als 0 oder 1 übergeben.
Bei einem Multiselect muss dann für 8 JA/Nein Felder genau ein Byte übertragen werden.
Verwendest Du hier kein Multiselect sondern überträgst die
Daten als einzele Form Elemente hast du einen grossen overhead,
Auch das auslesen geht durch bitshifting einiges effizienter.
LG
Das einzige, was er noch
am 03.10.2010 - 19:32 Uhr
Das einzige, was er noch machen könnte, wäre nicht 'checkbox' zu nehmen, sondern 'checkboxes' und vorher aus den Server-IDs ein Options-Array zu bauen. Das läuft allerdings auch auf mehrere einzelne Checkboxen hinaus.
Wie genau wölltest du hier denn das Multiselect verwenden?
@exterior Wie ich schon sagte
am 03.10.2010 - 21:04 Uhr
@exterior
Wie ich schon sagte ist das in reinem HTML ja
schon vorhanden:
http://www.siteexperts.com/tips/html/ts16/page1.asp
bei option müsste select das attribut multiple haben
und bei checkboxes müssen alle den gleichen namen haben.
auf der Serverseite ist beides das selbe.
LG
Zitat: bei option müsste
am 03.10.2010 - 22:19 Uhr
bei option müsste select das attribut multiple haben
So ein Multiple Select-Feld ist meiner Meinung nach alles andere als benutzerfreundlich... Da kann ich meine Leute schon Jammern hören, wenn ich sowas verwenden würde.
Und die Frage wäre, wie du den Checkboxen (also in der Form API die Elemente checkbox und checkboxes) allen den gleichen Namen mitgeben willst. Kann gut sein, dass ich da bisher was übersehen habe, aber ich wüsste gerade nicht, wie man das bewerkstelligen soll.
checkboxes gibt allen
am 03.10.2010 - 22:57 Uhr
Hi,
checkboxes gibt allen checkbox inputs den gleichen namen:
<input type="checkbox" name="myname[]" value="1"><input type="checkbox" name="myname[]" value="2">
Ich vermute stark die Drupal Form API rendert checkboxes so:
die options sind ein array der values und der name, der des form elements
<input type="checkbox" name="myname[0]" value="1"><input type="checkbox" name="myname[1]" value="2">
Beide Versionen sind serverseitig gleich
(Gilt auch für Checkboxes,Radios und Select)
LG