GELÖST - db_update bzw db_insert mit db_merge
Eingetragen von Mystery (63)
am 24.05.2015 - 22:01 Uhr in
am 24.05.2015 - 22:01 Uhr in
Hallo zusammen,
Ich arbeite gerade an einem Modul. Funktioniert auch alles soweit ganz gut. Nun möchte ich aber, das die "SUBMIT" funktion prüft ob ein eintrag mit dem aktuellem wert aus der $form_state in der datenbank schon vorhanden ist oder nicht und dann je nach dem ob TRUE oder FALSE db_insert bzw db_update ausführt.
Folgend mal grob meine Funktion.
<?php
function mene_submit_funktion ($form, &$form_state) {
if {
// meine zu prüfende variable $form_state{'mlid'] in meiner datenbank vorhanden?
// dann führe ein db_upate durch
} else {
// führe ein db_insert durch
}
}
?>
wie kann ich das denn lösen? Meine versuche haben bis jetzt nicht zum gewünschten resultat geführt.
- Anmelden oder Registrieren um Kommentare zu schreiben
Ist alles gar nicht
am 24.05.2015 - 22:09 Uhr
Ist alles gar nicht notwendig, dafür gibt es db_merge().
https://coderwall.com/p/hfag3q/drupal-s-db_merge-function-does-either-an...
sense-design | online solutions | Do not hack core!
Drupalcenter Verhaltensregeln | Threads bitte auf [gelöst] stellen.
Ok. Leider bekomme ich einen
am 24.05.2015 - 22:45 Uhr
Ok.
Leider bekomme ich einen fehler
Notice: Array to string conversion in DatabaseStatementBase->execute() (line 2171 of C:\xampp\apps\drupal\htdocs\includes\database\database.inc).
PDOException: SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s): SELECT 1 AS expression FROM {menu_svg_image} menu_svg_image WHERE ( (mlid = :db_condition_placeholder_0_0, :db_condition_placeholder_0_1, :db_condition_placeholder_0_2, :db_condition_placeholder_0_3, :db_condition_placeholder_0_4, :db_condition_placeholder_0_5, :db_condition_placeholder_0_6, :db_condition_placeholder_0_7, :db_condition_placeholder_0_8, :db_condition_placeholder_0_9, :db_condition_placeholder_0_10, :db_condition_placeholder_0_11, :db_condition_placeholder_0_12, :db_condition_placeholder_0_13, :db_condition_placeholder_0_14, :db_condition_placeholder_0_15) ); Array ( [:db_condition_placeholder_0_0] => value [:db_condition_placeholder_0_1] => 435 [:db_condition_placeholder_0_2] => 1 [:db_condition_placeholder_0_3] => 1 [:db_condition_placeholder_0_4] => [:db_condition_placeholder_0_5] => Array ( [0] => mlid ) [:db_condition_placeholder_0_6] => Array ( [0] => mlid ) [:db_condition_placeholder_0_7] => 0.003 [:db_condition_placeholder_0_8] => [:db_condition_placeholder_0_9] => [:db_condition_placeholder_0_10] => Array ( ) [:db_condition_placeholder_0_11] => before [:db_condition_placeholder_0_12] => edit-mlid [:db_condition_placeholder_0_13] => mlid [:db_condition_placeholder_0_14] => 1 [:db_condition_placeholder_0_15] => 1 ) in menu_svg_image_edit_item_submit() (line 132 of C:\xampp\apps\drupal\htdocs\sites\all\modules\menu_svg_image\menu_svg_image.module).
Hier mal meine Funktion
<?php
function menu_svg_image_edit_item_submit($form, &$form_state) {
$mlid = $form['mlid'];
dsm($form);
dsm($form_state);
$query_insert = db_merge('menu_svg_image')
->condition('mlid', $mlid, '=')
->fields(array(
'mlid' => $form_state['values']['mlid'],
'file_id' => $form_state['values']['menu_svg_image']['file_id'],
'options_id' => $form_state['values']['menu_svg_image']['options_id'],
'svg_css_id' => $form_state['values']['menu_svg_image']['options']['svg_tag_options']['svg_css_id'],
'svg_css_class' => $form_state['values']['menu_svg_image']['options']['svg_tag_options']['svg_css_class'],
'img_css_id' => $form_state['values']['menu_svg_image']['options']['img_tag_options']['img_css_id'],
'img_css_class' => $form_state['values']['menu_svg_image']['options']['img_tag_options']['img_css_class'],
))
->execute();
}
?>
Hi, die Anwendung der
am 25.05.2015 - 08:52 Uhr
Hi, die Anwendung der Funktion ist nicht korrekt, es fehlt der "key()", siehe hier:
http://drupaltonight.com/drupal-articles/using-dbmerge-query-insert-or-u...
Analog zur englischen Seite habe ich das auch in Deutsch hier nochmal zusammengefasst:
http://www.sense-design.de/tutorial/drupal-7-verwendung-von-dbmerge
sense-design | online solutions | Do not hack core!
Drupalcenter Verhaltensregeln | Threads bitte auf [gelöst] stellen.
Muss ich vor der db_merge
am 25.05.2015 - 10:19 Uhr
Muss ich vor der db_merge noch eine db_select ausführen, um alle mlid werte meiner tabelle abzufragen?
oder setze ich einfach nur
<?php
->key(array('mlid' => $mlid))
?>
denn wenn ich statt ->condition den ->key setze, bekom ic dennoch einen SQL Fehler
PDOException: SQLSTATE[42000]: Syntax error or access violation: 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 ' 'before', 'edit-mlid', 'mlid', '1', '1')) )' at line 1: SELECT 1 AS expression FROM {menu_svg_image} menu_svg_image WHERE ( (mlid IN (:db_condition_placeholder_0, :db_condition_placeholder_1, :db_condition_placeholder_2, :db_condition_placeholder_3, :db_condition_placeholder_4, :db_condition_placeholder_5_0, :db_condition_placeholder_6_0, :db_condition_placeholder_7, :db_condition_placeholder_8, :db_condition_placeholder_9, , :db_condition_placeholder_11, :db_condition_placeholder_12, :db_condition_placeholder_13, :db_condition_placeholder_14, :db_condition_placeholder_15)) ); Array ( [:db_condition_placeholder_0] => value [:db_condition_placeholder_1] => 435 [:db_condition_placeholder_2] => 1 [:db_condition_placeholder_3] => 1 [:db_condition_placeholder_4] => [:db_condition_placeholder_7] => 0.003 [:db_condition_placeholder_8] => [:db_condition_placeholder_9] => [:db_condition_placeholder_11] => before [:db_condition_placeholder_12] => edit-mlid [:db_condition_placeholder_13] => mlid [:db_condition_placeholder_14] => 1 [:db_condition_placeholder_15] => 1 [:db_condition_placeholder_5_0] => mlid [:db_condition_placeholder_6_0] => mlid ) in menu_svg_image_edit_item_submit() (line 133 of C:\xampp\apps\drupal\htdocs\sites\all\modules\menu_svg_image\menu_svg_image.module).
Noch eine Frage.
Muss die mlid in meiner Tabelle gezwungener maßen ein primär key sein?
Ist $mlid denn ein String
am 25.05.2015 - 11:07 Uhr
Ist $mlid denn ein String oder Integer, scheint mir eher so als wäre $mlid ein array oder eine Formularkomponente ("edit-mlid").
Du bekommst die Werte des abgeschickten Formulars über das $form_state['values'], siehe mein Tutorial, dort habe ich das auch beschrieben.
sense-design | online solutions | Do not hack core!
Drupalcenter Verhaltensregeln | Threads bitte auf [gelöst] stellen.
Hi Sense.Ok ein Problem
am 25.05.2015 - 11:33 Uhr
Hi Sense.
Ok ein Problem gelöst, die $mlid war ein teil von $form['mlid'] und nicht $form_state['mlid']. dasss verursachte den SQL Fehler.
Allerddings, überschreibt meine anweisung keine einträge mit vorhanener mlid sondern insert neue. Wo hängt es denn nun noch? Hier noch mal meine db_merge
<?php
function menu_svg_image_edit_item_submit($form, &$form_state) {
$mlid = $form_state['mlid'];
$query_insert = db_merge('menu_svg_image')
->key(array('mlid' => $mlid,))
->fields(array(
'mlid' => $form_state['values']['mlid'],
'file_id' => $form_state['values']['menu_svg_image']['file_id'],
'options_id' => $form_state['values']['menu_svg_image']['options_id'],
'svg_css_id' => $form_state['values']['menu_svg_image']['options']['svg_tag_options']['svg_css_id'],
'svg_css_class' => $form_state['values']['menu_svg_image']['options']['svg_tag_options']['svg_css_class'],
'img_css_id' => $form_state['values']['menu_svg_image']['options']['img_tag_options']['img_css_id'],
'img_css_class' => $form_state['values']['menu_svg_image']['options']['img_tag_options']['img_css_class'],
))
->execute();
}
?>
Zur übersssicht der SQL Tabelle al die Install
<?php
function menu_svg_image_schema() {
$schema ['menu_svg_image'] = array(
'description' => 'The base table for menu svg image module.',
'fields' => array(
'msi_id' => array(
'description' => 'The primary identifier for a entry of menu svg image data.',
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
),
'mlid' => array(
'description' => 'The menu link id.',
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
),
.........
),
'primary key' => array('msi_id'),
);
return $schema;
}
?>
Der Wert sollte über
am 25.05.2015 - 12:02 Uhr
Der Wert sollte über $form_state['values']['mlid'] bereit bestellt werden.
sense-design | online solutions | Do not hack core!
Drupalcenter Verhaltensregeln | Threads bitte auf [gelöst] stellen.
Danke. jetzt klappt ess.
am 25.05.2015 - 17:10 Uhr
Danke. jetzt klappt es.
Eh man als anfänger in sachen modul schreiben mal durchgesehen hat, ist gar ni so einfach.
Dafür gibt es ja die
am 25.05.2015 - 21:47 Uhr
Dafür gibt es ja die Community.
sense-design | online solutions | Do not hack core!
Drupalcenter Verhaltensregeln | Threads bitte auf [gelöst] stellen.