PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Cron hilfe



mine321
16.11.2014, 16:54
Hallo ich habe folgenden Cron erstellt, doch irgendwie fehlt die vollendung.


<?php
$sk = mysql_fetch_assoc(db_query("SELECT `umrechnung` FROM vms_seitenkonfig LIMIT 1"));
$ku = mysql_fetch_assoc(db_query("SELECT `Wert` FROM klickis_umwandlung WHERE DATE(Datum) = CURDATE() LIMIT 1"));

if($ku['Wert'] > 0) {
$temp = $sk['sumrechnung'] * $ku['Wert'];
db_query("UPDATE klickis_umwandlung SET `Kurs` = '".$temp."' WHERE DATE(Datum) = CURDATE() LIMIT 1");
}


Ziel ist es den wert umrechnung aus der " tabelle 1 " vms_seitenkonfig zu holen und in " Tabelle 2 " einzutragen bzw umgerechnet einzutragen.

Irgendwie klappt dies nicht so wie ich es gedacht habe, jemand eine Idee für mich?

Lokutos
16.11.2014, 18:18
Hi Vorweg,

Du solltest du angewöhnen einheitlich zu schreiben,

bei manchen spalten nutzt du in mysql `irgendwas` und an anderen orten nutzt du die `` nicht...

sprich
hier erstmal überarbeitet:



<?php
$sk = mysql_fetch_assoc(db_query("SELECT `umrechnung` FROM `vms_seitenkonfig` LIMIT 1"));
$ku = mysql_fetch_assoc(db_query("SELECT `Wert` FROM `klickis_umwandlung` WHERE DATE(`Datum`) = CURDATE() LIMIT 1"));

if($ku['Wert'] > 0) {
$temp = $sk['sumrechnung'] * $ku['Wert'];
db_query("UPDATE `klickis_umwandlung`SET `Kurs` = '".$temp."' WHERE DATE(`Datum`) = CURDATE() LIMIT 1");
}


Dan hab ich kurz ne frage, die gros und Kleinschreibung bei den spalten in Mysql ist korrekt? (Datum mit grossen "D")

Da ich die Datenbankstruktur nicht kenne vermute ich mal das der Fehler in
WHERE DATE(`Datum`) = CURDATE()

Als einfaches Debug mittel würde ich einfach mal in die Datenbank mittels phpmyadmin gehen und die 2 querys ausführen
SELECT `umrechnung` FROM `vms_seitenkonfig` LIMIT 1
und
SELECT `Wert` FROM `klickis_umwandlung` WHERE DATE(`Datum`) = CURDATE() LIMIT 1

und schauen ob du jeweils den richtigen wert bekommst oder ob dir die Datenbank eine Fehlermeldung gibt.

Kraemer84
16.11.2014, 23:46
ist es eigentlich nicht besser anstatt "db_query" "mysql_query" zu verwenden ?

Lokutos
17.11.2014, 00:25
Die Funktion db_query();
wird vom vms für die Datenbankanbindung genutzt,
insofern alle die entsprechende Funktion nutzen is es so das theoretisch die Anbindung nur in der functions.lib.php geändert werden muss um z.b. mysqli zu nutzen.

da grundsätzlich auch die vorhandenen Funktionen wie
db_connect();
und
db_close(); genutzt werden um die Datenbankverbindung aufzubauen und zu schliessen


nebenbei könnte man teoretisch die funktion auch nutzen um gegen mysql injections vorzugehen

beispielcode -> falsche nutzung


// UPDATE SQL
db_query("UPDATE `tabelle` SET `text` = '".$_POST["text"]."' WHERE id ='".$_POST["id"]."'");
beispielcode -> richtige nutzung

// UPDATE SQL
db_query("UPDATE `tabelle` SET `text` = '%s' WHERE id ='%d",$_POST["text"],$_POST["id"]);

wenn man nun davon ausgeht das
text = blablabla
id = 1'; DROP DATABASE
ist

dann lauten die schlussendlich an die Datenbank abgesendeten befehle so:

UPDATE `tabelle` SET `text` = 'blablabla' WHERE id ='1'; DROP DATABASE;

UPDATE `tabelle` SET `text` = 'blablabla' WHERE id ='1';

Bei ersterem habt Ihr Danach keine Datenbank mehr, beim zweiten ist alles in ordnung
Grund: %s -> ist ein string , %d -> Integer

und selbst in dem falle das überall nur %s genutzt wird läuft in jedem falle immer ein mysql_real_escape_string drüber.

mine321
17.11.2014, 10:52
SELECT `Wert` FROM `klickis_umwandlung` WHERE DATE(`Datum`) = CURDATE() LIMIT 1
MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze)

SELECT `umrechnung` FROM `vms_seitenkonfig` LIMIT 1
Zeige Datensätze 0 - 0 (1 insgesamt, Die Abfrage dauerte 0.0002 Sekunden)

Also liegt der Fehler hier DATE(`Datum`) = CURDATE() oder? Weil einige maunell eingetagene Einträge sind ja vorhanden.

Lokutos
17.11.2014, 18:10
ja (unter vorbehalt da ich die datenbankstruktur nicht kenne)

könntest du ev. mal von einem testeintrag den wert in `Datum` hier Posten
resp, hat es überhaupt einen eintrag wo das heutige datum drin steht?

und einen export von der struktur / resp. welchen datentyp hat die spalte `Datum` ?

Kraemer84
17.11.2014, 18:31
Ich würd das testhalber mal mit der php Variante probieren.. sprich anstatt im query mit curdate erst mit einer variablen die Abfrage zu gestalten Ein beispiel hier [php] Die Variante die jetzt Lokutos vorschlägt ('%s') denke ich ist ein Umbau später wert aber erstmal das du rein das Ergebnis erzielst.. wobei jetzt eh mal .. wenn man doch vorher mit mysql_real_escape_string die Variable entschärft ist es doch dann eigentlich egal ? also ausser das man ein paar Zeilen mehr hat und das minimal mehr perfomance nimmt oder gibt es da noch was extra weswegen man es so nicht machen sollte ? //edit also irgendwas funktioniert hier gerade nicht so richtig ..

mine321
17.11.2014, 19:46
Aufgebaut ist die Tabelle so

CREATE TABLE IF NOT EXISTS `klickis_umwandlung` (
`id` int(250) NOT NULL AUTO_INCREMENT,
`Datum` date NOT NULL,
`Wert` int(11) NOT NULL DEFAULT '1',
`Kurs` double(11,2) NOT NULL DEFAULT '0.00',
`Umrechnung` varchar(250) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;


heutiger Eintrag

http://www.chickis.de/gallery/4-1416249961.jpg

Lokutos
17.11.2014, 20:39
hm also

WHERE `Datum` = CURDATE() LIMIT 1

sollte dann eigentlich ausreichend sein.

mine321
18.11.2014, 11:14
Jup danke hat Klasse funktioniert, aber

was mir erst am Ende auffiel, ich brauch kein update sondern ein INSERT INTO.


Aber es klappt nun alles, das einzigste was noch gestört hat war

$ku = mysql_fetch_assoc(db_query("SELECT `Wert` FROM `klickis_umwandlung` WHERE DATE(`Datum`) = CURDATE() LIMIT 1"));

dies entfernt und schwups läuft alles reibungslos