Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Anfängerfragen ›

[Gelöst] mysql DELETE mit checkboxen

Eingetragen von N20 (34)
am 03.10.2010 - 10:07 Uhr in
  • Anfängerfragen
  • Drupal 6.x

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?

‹ Navigation in 3 Ebenen (gelöst)E-Mailverifikation wird nicht versendet wenn admin user erstellt, kann das irgendwo eingestellt werden? ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Hi also das Modul sieht

Eingetragen von Hyp1 (1463)
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?)

Zitat:

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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Zitat: db_query("DELETE FROM

Eingetragen von Exterior (2903)
am 03.10.2010 - 11:56 Uhr
Zitat:

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:

<?php
db_query
("DELETE FROM {module__server} WHERE id = '%s';", $form['values']['id']);
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

So habe ich es im

Eingetragen von N20 (34)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Du machst aber mitunter auch

Eingetragen von Exterior (2903)
am 03.10.2010 - 13:10 Uhr

Du machst aber mitunter auch ein paar echt seltsame Sachen...

Zitat:

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.

Zitat:

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.

Zitat:

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:

Zitat:

if ($value == 1)

(Man beachte das zweite =-Zeichen)

Zitat:

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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Exterior hat in allen Punkten

Eingetragen von Hyp1 (1463)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

In der Tabelle stehen

Eingetragen von N20 (34)
am 03.10.2010 - 13:30 Uhr

In der Tabelle stehen nummern:

`id` int(2) unsigned NOT NULL auto_increment

Ja, 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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

1. Ich sagte bereits Du

Eingetragen von Hyp1 (1463)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Zitat: 2. DeinFieldset mit

Eingetragen von Exterior (2903)
am 03.10.2010 - 14:28 Uhr
Zitat:

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).

  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke!! So funktioniert es

Eingetragen von N20 (34)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Man kann als return_value

Eingetragen von Exterior (2903)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Verstehe, habe das wohl

Eingetragen von N20 (34)
am 03.10.2010 - 15:09 Uhr

Verstehe, habe das wohl falsch interpretiert.

Danke für eure Hilfe!

  • Anmelden oder Registrieren um Kommentare zu schreiben

@Exterior hi das mit den

Eingetragen von Hyp1 (1463)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Das einzige, was er noch

Eingetragen von Exterior (2903)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

@exterior Wie ich schon sagte

Eingetragen von Hyp1 (1463)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Zitat: bei option müsste

Eingetragen von Exterior (2903)
am 03.10.2010 - 22:19 Uhr
Zitat:

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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

checkboxes gibt allen

Eingetragen von Hyp1 (1463)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 1 Woche 6 Tagen
  • Hey danke
    vor 2 Wochen 3 Minuten
  • Update: jetzt gibt's ein
    vor 2 Wochen 18 Stunden
  • Hallo, im Prinzip habe ich
    vor 2 Wochen 5 Tagen
  • Da scheint die Terminologie
    vor 2 Wochen 5 Tagen
  • Kannst doch auch alles direkt
    vor 3 Wochen 2 Tagen
  • In der entsprechenden View
    vor 3 Wochen 2 Tagen
  • Dazu müsstest Du vermutlich
    vor 3 Wochen 2 Tagen
  • gelöst
    vor 5 Wochen 6 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 6 Wochen 22 Minuten

Statistik

Beiträge im Forum: 250233
Registrierte User: 20451

Neue User:

  • ByteScrapers
  • Mroppoofpaync
  • 4aficiona2

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 32 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association