Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 20. Juni 2018 11:28

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.085
Webseite

Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Hallo,

ich hab einige Scripts gebaut um Daten aus das Planungsprogram Booked
in CGCalendar zu holen.

Jetzt suche ich schon Tagen lang warum eine Zeile nicht funktioniert.

Ich lese ein vorher produzierte CSV und will die in der DB von CMSMS einlesen.

[== php ==]
$fileData = fopen("transferfile.csv", "r");
while($row=fgetcsv($fileData)){ 
$query = mysqli_query($conn, "
insert into cmspe_module_cgcalendar_events_to_categories
(category_id, event_id)
VALUES ('1', $newid);
");
$query = mysqli_query($conn, "
insert into cmspe_module_cgcalendar_events 
(event_id, event_title, event_summary, event_details, event_date_start, event_date_end, event_parent_id, event_recur_period, event_date_recur_end, event_created_by,
event_create_date, event_modified_date, event_recur_nevents, event_recur_interval, event_allows_overlap, event_all_day)
VALUES ('$newid', '$row[2]', '$row[3]', '$row[4]', '$row[0]', '$row[1]','-1', 'none', $nichts, '1', '$row[5]', '$row[5]', '-1', '1', '1', '0');
");
$newid = $newid + 1;
}

$newid = $newid - 1;
$query = mysqli_query($conn, "
UPDATE cmspe_module_cgcalendar_events_seq
SET id = '$newid';
");

fclose($fileData);

Die Schleife wird durchlaufen, denn events-to-categories wird gefüllt.
Auch events-seq wird geupdated.

Wenn ich nur mit "echo" daten abrufe wird alles schön gelistet.
Wenn ich alle Variabelen in PHP eine Wert gebe schreibt er die Daten (1 Zeile) braf in der Datenbank.
nur in der "while-Schleife" geht es nicht.

Ich muss da wohl etwas falsches machen in "insert into cmspe_module_cgcalendar_events . . . .".

MfG
Jan


Ubuntu 16.04 mit KDE - LAMP

Offline

#2 20. Juni 2018 16:28

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.160

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Lass Dir doch einfach mal die SQL-Fehlermeldung bzw. den Query im Script ausgeben. Dann siehst Du das Problem. Da steht dann nämlich wortwörtlich sowas wie

... VALUES ('1', 'Array[2]', 'Array[3]', ' ...

Es wird versucht, die Variable "$row" auszugeben. Und die Ausgabe von "$row" ergibt in PHP nunmal "Array", weil "$row" ein Array ist, das man nicht einfach so ausgeben kann. D.h. die eckigen Klammern werden von PHP nicht als Teil der Variablen "$row" interpretiert. Übliches Problem, wenn man mit Variablen in Text arbeitet. Woher soll PHP wissen, was Variable und was Text ist?

Mit Syntaxhiglighter sieht man das recht deutlich:

... VALUES ('$newid', '$row[2]', '$row[3]', ' ...

Alles was hell rot ist, ist Text, der 1:1 an die DB übergeben wird.
Alles was blau ist, sind Variablen, die von PHP zur Laufzeit in Werte übersetzt werden.

Lösung:

Setz die Variablen mal in geschweifte Klammern:

... VALUES ('$newid', '{$row[2]}', ...

Sieht bei mir im Editor dann so aus:

... VALUES ('$newid', '{$row[2]}', '{$row[3]}', ' ...

Durch die geschweiften Klammen weiß PHP, was Variable ist, und was Text.


Oder setze den Query so zusammen:

... VALUES ('$newid', '" . $row[2] . "', ...

... VALUES ('$newid', ' " . $row[2] . " ', ...

Offline

#3 20. Juni 2018 17:14

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.085
Webseite

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Danke Nan,

versuche, ich versuche es etwas später.
Was ist das für Syntax-Highlighter?

MfG
Jan


Ubuntu 16.04 mit KDE - LAMP

Offline

#4 21. Juni 2018 08:09

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.160

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Hab da nichts besonderes. Ich verwende jEdit. Aber im Prinzip ginge da bestimmt auch jeder andere Editor (Dreamweaver, Sublime, Eclipse, Notepad++ ...).

Offline

#5 21. Juni 2018 08:38

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.085
Webseite

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Ich habe alle Kombinationen versucht aber innerhalb der Schleife will nichts funktionieren.
So wie ich es sehe muss ich eine neue CSV produzieren und die ausserhalb mit load infile in mysql trichtern.

MfG
Jan


Ubuntu 16.04 mit KDE - LAMP

Offline

#6 21. Juni 2018 09:09

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.160

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Wie sieht denn der Query am Ende aus, den Du an die Datenbank schicken willst?
Wie lautet denn die Fehlermeldung der Datenbank?

load infile ist zwar ganz nett, aber das funktioniert nicht bei jedem Provider.

Offline

#7 21. Juni 2018 15:20

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.085
Webseite

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Hallo NaN,

es gab zwar Fehler aber nichts das mich weiter bringt, nur das eine Datei sich nicht umbenennen lies wegen Berechtigungsfehler, das hat weiter kein Einfluss auf diesen Problem.

Ich werde erst mal ein ganz kleines Beispiel machen und sehen ob ich aus dem Array etwas in einer Tabelle kriege.

Mit echo kann ich jeden Wert auslesen, nur bei schreiben geht es schief, und nur bei dem Array.

MfG
Jan


Ubuntu 16.04 mit KDE - LAMP

Offline

#8 21. Juni 2018 16:14

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.160

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

es gab zwar Fehler aber nichts das mich weiter bringt, nur das eine Datei sich nicht umbenennen lies wegen Berechtigungsfehler, das hat weiter kein Einfluss auf diesen Problem.

Ich rede von MYSQL Fehlern.
Die musst Du Dir mit mysqli_error()   im PHP-Script selber ausgeben lassen.

Offline

#9 22. Juni 2018 20:30

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.085
Webseite

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Hallo NaN,

offensichtlich ist es nicht möglich innerhalb eine While-Schleife Mysql-inserts zu tun mit Arrays, das ist in Internet auf mehrere Stellen beschrieben, es wird ausdrücklich gewarnt für so eine Konstruktion.

Ich habe es anders gelöst.

[== PHP ==]
$string="";

$fileData = fopen("transferfile.csv", "r");

while($row=fgetcsv($fileData)){
$string = $string."('".$newid."','".$row[1]."','".$row[5]."'),";
$newid = $newid + 1;
}

$string = substr($string, 0, -1); //entfernen letzte Komma

$query = mysqli_query($conn, "INSERT INTO testen (id, text, textmehr)
VALUES $string");

Damit kann ist mein Problem gelöst.
Danke für Deine Hilfe, es hat mich auf die richtige Spur gelenkt.

MfG
Jan


Ubuntu 16.04 mit KDE - LAMP

Offline

#10 18. Juli 2018 22:07

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.085
Webseite

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Jetzt habe ich alle Fehler beseitigt . . . .  auf eine.

Aus Booked hole ich mit richtige Zeitzone, richtige Characterset und auf die richtige Mysql-art alle Daten die ich dann in eine CSV-Datei stecke die van Server1 nach Server2 kopiert wird.

Bei Einlesen funktioniert alles wenn ich bei mir auf localhost das Script starte da habe ich PHP 7.0 und Mysql 5.7. In der Life-situation habe ich PHP 5.6 und Mysql 5.6.

Ob es daran liegt bezweifele ich, vielleicht an Berechtigungen obwohl 2 von 3 Insert-Scripts funktionieren.

Es betrifft code:

[== PHP ==]
$stringev=$stringev."('".$newid."','".$row[2]."','".$row[3]."','".$row[4]."','".$row[0]."','".$row[1]."','-1','none',NULL,'1','".$row[5]."','".$row[5]."','-1','1','1','0'),";

insert into cmspe_module_cgcalendar_events 
(event_id, event_title, event_summary, event_details, event_date_start, event_date_end, event_parent_id, event_recur_period, event_date_recur_end, event_created_by,
event_create_date, event_modified_date, event_recur_nevents, event_recur_interval, event_allows_overlap, event_all_day)
VALUES ($string);

Weil es ein Webpack betrifft habe ich nur beschränkt Zugang zu Logfiles.

Hat jemandem ein Hint wo ich suchen soll?

MfG
Jan

Beitrag geändert von Janl (18. Juli 2018 22:09)


Ubuntu 16.04 mit KDE - LAMP

Offline

#11 21. Juli 2018 18:29

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.160

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Was macht das Komma am Ende des Queries?

Offline

#12 21. Juli 2018 20:02

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.085
Webseite

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Hallo NaN,

der String "$Stringev" wird aufgebaut aus mehrere Termine/Queries die in ein Query mit Insert in der Tabelle geschrieben werden, der letzte Komma wird entfernt.

So funktioniert es lokal, dann schreibt er brav alle Termine/Rows in der Tabelle .
Nur mit diesen Webpack geht es nicht und ich habe keinen Zugriff auf Logfiles.

MfG
Jan


Ubuntu 16.04 mit KDE - LAMP

Offline

#13 21. Juli 2018 20:22

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.160

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Naja, Du brauchst keine Logfiles.
Du kannst Dir doch den letzten mysql Fehler selber ausgeben:

$db = cmsms()->GetDB();
$query = '...';
$db->Execute( $query );
echo $db->ErrorMsg();

Offline

#14 21. Juli 2018 20:33

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.085
Webseite

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Danke NaN,

aber das ist von innerhalb CMSMS, mein Script läuft ausserhalb.
Direkt im OS mit Mysql.

Die Idee es von innerhalb zu regeln muss ich mal anschauen.

MfG
Jan


Ubuntu 16.04 mit KDE - LAMP

Offline

#15 22. Juli 2018 07:46

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.160

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Na dann nimm halt direkt die mysqli_error() Funktion. Das Prinzip ist das gleiche. Nach dem Ausführen des Querys, die letzte Fehlermeldung ausgeben. Du musst an die Fehlermeldung rankommen. Ohne die wird es schwierig, herauszufinden, was genau das Problem ist.

Offline

#16 22. Juli 2018 09:29

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.085
Webseite

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Danke NaN,

wieder was gelernt! Ich habe hier einige Bücher über PHP und Mysql, das habe ich das leider nicht gefunden.

Kannst Du mich etwas raten über Programmier-Prinzipes in PHP denn so etwas möchte ich zum lernen.

MfG
Jan


Ubuntu 16.04 mit KDE - LAMP

Offline

#17 23. Juli 2018 12:04

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.160

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Hab mir das alles auch nur selber beigebracht.
Damals noch mit einem fetten Buch über php 4.9 und CMSms wink
Kein Witz durch CMSms hatte ich vor 12 Jahren das erste Mal Kontakt mit PHP.
Learning by doing.
Und abgucken big_smile
CMSms, Google, Stackoverflow ...
Die haben das Buch dann ziemlich schnell abgelöst.

Recherchieren, recherchieren, recherchieren.

Kann Dir da sonst leider kein Rezept geben. Ich sag immer, beim Programmieren muss "nur" eine bestimmte Denkweise einsetzen (abstrakt, logisch, analytisch). Man muss das Prinzip verstanden haben wie eine Maschine arbeitet. Das ist allerdings der schwierigste Teil. Für den ist man mehr oder minder begabt, aber man kann das trotzallem erlernen. Kostet schlimmstenfalls Zeit und Nerven. Aber der Rest ist Syntax bzw. Vokabular. Das muss man nicht wissen, das kann man nachlesen. Man muss nur wissen wo es steht und wonach man suchen muss wink Ist wie bei jeder anderen Sprache auch. Wenn Du Grammatik und Kultur halbwegs begriffen hast, brauchst Du nur noch ein Wörterbuch und wirst Dich in jedem Land der Welt zurechtfinden lol

Sobald Du in der Lage bist, Dein Vorhaben in eine logische für Maschinen verständliche Form zu abstrahieren, braucht es nur noch einen Blick ins Wörterbuch. Und wenn Dein Wörterbuch grundlegende Funktionen von PHP und MySQL insbesondere zum Thema Fehleranalyse nicht enthält, dann ist das Buch nicht viel Wert. Du musst aber selber erstmal auf die Idee kommen, Dein Script an einer bestimmten Stelle auf Fehler oder Zwischenergebnisse überprüfen zu wollen. Das nimmt Dir kein Buch ab.

Mir hilft bei sowas immer "Detektivarbeit". Ich habe ein Ergebnis. Und wenn das nicht das gewünschte ist, dann gehe ich von diesem Ergebnis alle Stationen rückwärts durch, die Einfluss auf dieses Ergebnis haben. Von hinten nach vorne. Zeile für Zeile, Funktion für Funktion, Datei für Datei. Und an jeder Stelle lasse ich mir dann die Zwischenergebnisse ausgeben. (= analytische Denkweise; wenn Z dies ist, dann muss Y jenes sein) In Deinem Falle stößt man dann irgendwann auf einen scheinbar korrekten Query der dennoch nicht das gewünschte Ergebnis liefert. Die nächste Station ist MySQL. Da drin gibt es einen Fehler. Um diesen Fehler in Erfahrung zu bringen, muss man ihn ausgeben. Und da ja z.B. phpMyAdmin oder Adminer MySQL-Fehler ausgeben können, muss es dazu also eine PHP-Funktion geben. Und dann landet man bei Google relativ schnell bei mysqli_error(), ohne dass man diese Funktion vorher gekannt haben muss. Man muss vielleicht noch wissen, dass PHP und MySQL zwei verschiedene eigenständige Umgebungen sind. Die laufen völlig unabhängig voneinander. Fehler in PHP werden in PHP ausgegeben. Fehler in MySQL in MySQL. Wenn ich aber MySQL von einem PHP-Script aus ausführe, dann bekommt PHP nichts von diesen Fehlern mit. Die muss man sich erst selber holen.

Offline

#18 23. Juli 2018 13:29

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.085
Webseite

Re: Problem mit Mysql in Script zur Füllung CGCalender mit CSV

Hallo NaN,

Danke für deinem ausführliche Antwort.
So habe ich mich auch alles selber beigebracht, sehr viel Dank allen in diesem Forum.

Ich war umgeschult zu Systemmanager, habe mit S36 (IBM), DEC PDP und VaxVMS gearbeitet.
Steile Karriere bis meine Frau in Holland zur Besuch war . . . .
Dann waren wir etwa 10 Jahren im Fotografie aktiv, meine Frau hat eine Name gehabt, war bekannt.

Dann ist die Digitalisierung gekommen und was meine Frau gemacht hat war nicht mehr gefragt, so bin ich wieder eingestiegen, mit Webseiten.

Jetzt nach 10 Jahren bin ich wieder fit, nur machmal fehlen solche Kleinigkeiten wie Error-Ausgabe von Mysql in PHP, ich suche immer als erste auf OS-Nivo.
Deswegen liefere ich nichts mehr auf Webpacks wo ich kein Zugang zum OS habe, Meine eigene PC läuft unter Linux, das gefällt mir am besten.

MfG
Jan


Ubuntu 16.04 mit KDE - LAMP

Offline