*GELÖST* Fehler bei SQL INSERT
am 02.04.2015 - 11:07 Uhr in
Hallo zusammen,
ich erstelle gerade zur Übung ein kleines Modul namens Copyright, um Drupal, PHP und SQL tiefgehender zu verstehen und zu lernen.
Mein Modul besteht aus folgenden Datein:
- copyright.info
- copyright.install
- copyright.modul
- copyright.admin.inc
Soweit funktioniert bis jetzt auch alles wie gewünscht. Nun sitze ich daran, die eingegeben Daten in die Tabelle zu speichern und bekomme hier einen Fehler, woraus ich nicht schlau werde.
Fehlermeldung:
Notice: Undefined index: copyright_description in copyright_admin_settings_submit() (line 51 of C:\xampp\htdocs\gta-league\sites\all\modules\copyright\copyright.admin.inc).
PDOException: SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 1: INSERT INTO {copyright} (copyright_text,copyright_description,copyright_url,copyright_url_name) VALUES (''); Array ( ) in copyright_admin_settings_submit() (line 52 of C:\xampp\htdocs\gta-league\sites\all\modules\copyright\copyright.admin.inc).
Hier mal die function die für das speichern zuständig ist:
<?php
49 function copyright_admin_settings_submit ($form) {
50 db_query('DELETE FROM {copyright}');
51 db_query("INSERT INTO {copyright} (copyright_text,copyright_description,copyright_url,copyright_url_name) VALUES ('".$form['copyright']['copyright_text']['copyright_description']
52 ['copyright_url']['copyright_url_name']."')");
53 drupal_set_massage('Your Copyright Info has been saved.');
54
55 }
?>
Hier das Formular wo die daten eingegeben werden:
<?php
function copyright_admin_settings() {
$form['copyright'] = array (
'#type' => 'fieldset',
'#title' => 'Copyright settings',
'#description' => 'Create an copyright text like "Powered by LINKNAME and an description under this line"',
);
$form ['copyright']['copyright_text'] = array (
'#type' => 'textfield',
'#title' => 'Text',
'#default_value' => '',
'#description' => 'Input a text like "Powered by"',
);
$form ['copyright']['copyright_description'] = array (
'#type' => 'textarea',
'#title' => 'Description under your Copyright',
'#rows' => 6,
'#default_value' => '',
'#description' => 'A longer text under your copyright',
);
$form ['copyright']['copyright_url'] = array (
'#type' => 'textfield',
'#title' => 'Link URL',
'#default_value' => '',
'#description' => 'Link to the copyright site',
);
$form ['copyright']['copyright_url_name'] = array (
'#type' => 'textfield',
'#title' => 'Name of the URL',
'#default_value' => '',
'#description' => 'This where show as your link to the URL',
);
$form ['copyright']['copyright_submit'] = array (
'#type' => 'submit',
'#value' => 'Save/Update'
);
return $form;
}
?>
Hier noch das SQL Schema in der copyright.install:
<?php
function copyright_schema() {
$schema['copyright'] = array(
'fields' => array (
'copyright_id' => array (
'description' => 'id of copyright',
'type' => 'int',
'unsigned' => TRUE,
'auto_increment' => TRUE,
'not null' => TRUE,
),
'copyright_text' => array (
'description' => 'text of copyright',
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => 'Powered by Copyright module',
),
'copyright_description' => array (
'description' => 'description for copyright',
'type' => 'text',
'not null' => TRUE,
'size' => 'big',
'default' => '',
),
'copyright_url' => array (
'description' => 'url of copyright',
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
),
'copyright_url_name' => array (
'description' => 'name of url for copyright',
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
),
),
'primary key' => array('copyright_id'),
);
return $schema;
}
?>
Ich denke die gegeben Informationen sind aussreichend für die Fehlerbehebung. Falls nicht, dann gebt bescheid.
Ich werde aus der Fehlermeldung einfach nicht schlau und finde auch nicht den Fehler. Habe schon eine andere Syntax variante genommen, die mir phpMyAdmin gibt, aber auch diese führt zu fehlern. Würde mich freuen, wenn mir jemand den Fehler sagen kann und erklären kann warumm der Fehler entstanden ist und mir diesen auch korrigieren kann.
- Anmelden oder Registrieren um Kommentare zu schreiben
Das array wird offenbar nicht aufgelöst
am 02.04.2015 - 12:06 Uhr
lass dir mit dem devel module die Datenstruktur anzeigen, ehe du sie "auf die Reise" schickst.
Grüße
Ronald
Danke
am 02.04.2015 - 12:55 Uhr
Danke, ich komme dennoch nicht weiter....
Zitat:<?php51
am 02.04.2015 - 13:07 Uhr
<?php
51 db_query("INSERT INTO {copyright} (copyright_text,copyright_description,copyright_url,copyright_url_name) VALUES ('".$form['copyright']['copyright_text']['copyright_description']
52 ['copyright_url']['copyright_url_name']."')");
?>
Zähle doch mal die Werte, die Du eintragen willst und dann die Anzahl der übergebenen Werte. Du hast da einen Mischmasch von ' und ". Dadurch bleiben am Ende keine 4 Werte für den Insert und genau das besagt Deine Fehlermeldung
1136 Column count doesn't match value count
. Bau Dir die Query mal richtig mit Werten zusammen. Dann siehst Du auch Deinen Fehler, denn es muß schließlich ein gültiges SQL-Statement entstehen. Ich nehme an, es muß jedesmal $form['xxx'], $form['yyy'], .... heißen.
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Das, was du lieferst,
am 02.04.2015 - 13:53 Uhr
ist ein sehr tief verschachteltes Array ohne Inhalt.
<?php
51 db_query("INSERT INTO {copyright} (copyright_text,copyright_description,copyright_url,copyright_url_name) VALUES ('".$form['copyright']['copyright_text']['copyright_description']
52 ['copyright_url']['copyright_url_name']."')");
?>
muss heißen:
db_query("INSERT INTO {copyright} (copyright_text,copyright_description,copyright_url,copyright_url_name) VALUES ('".$form['copyright_text']."','".$form['copyright_description']."','".$form['copyright_url']."','".$form['copyright_url_name']."')");
Ich hoffe, ich habe mich nicht vertippt ;-)
Grüße
Ronald
Danke Ronal
am 02.04.2015 - 15:15 Uhr
alleringss sagt mir SQL mmit deiner lösung : Notice: Undefined index: copyright_text in copyright_admin_settings_submit() und das für alle 4 Elemente...
Langgsam bin ich ratlos, da ich das ganze anhand einess Tutorials aufbaue, nur halt für ein oul abäner. Ddie Funktionen sind aber si 1:1 von der strucktur her übernommen.
EDIT:
Lösung gefunden.....
ich habe in er Form den index so definiert:
<?php
$form ['copyright']['copyright_text'] = array
?>
sogleich ergibt sich, das ich die werte in VALUES auc so übergeben muss:
<?php
('".$form['copyright']['copyright_text']['#value']."')
?>
Aber danke für deinen Ansatz, der sehr hilfreich war.
du hast doch sicher das devel modul aktiv
am 02.04.2015 - 15:18 Uhr
schaue dir die Datenstruktur des formulares an.
Meine Struktur ist von deiner Vorgabe ausgegangen.
Es kann auch heißen $form['fields'][..., oder irgendwie in dieser Art.
Wenn du einigermaßen sicher im Lesen von Arraystrukturen bist, kannst du das leicht herausfinden, und ggf. vor der Übertragung in die SQL-Syntax vereinfachen.
Grüße
Ronald
sicher??
am 02.04.2015 - 15:24 Uhr
So sicher beim php und sql lesen und schreiben bin ich leider noch nicht, deswegen ja auch das kleine Übungsmodul um da durch zu blicken.
Submit macht nun genau dass was es soll nach noch kleiner Änderung deiner Struktur.