schnelle Hilfe php

spar-daniel

Well-known member
ID: 369441
L
12 November 2009
407
11
Huhu :D

Brauche mal bitte Hilfe:

Kann mir jemand sagen wo hier der Fehler ist?

db_query ('UPDATE '.$db_prefix.'_knock_out_ralley SET ap = 0.00');

Wenn ich den Code so in phpmyadmin einfüge klappt es, der code ist aber in einem cron per php und klappt beim aufrufen nicht.
Warum ??? :wall:

Gruß

spar-daniel
 
Wird wohl ein DOUBLE sein. Lass doch .00 weg und probiers nochmal.

db_query benötigt wohl die VMS-Functions ... weißte ja, ne ;)
... sonst DB connecten und mittels mysql_query versuchen.

allerdings dann
PHP:
mysql_query('UPDATE vms_knock_out_ralley SET ap = `0`');
weil $db_prefix ja dann unbekannt.

oder mit VMS-Functions aus der Root
PHP:
<?
require ( 'lib/functions.lib.php' );
db_connect();
db_query('UPDATE '.$db_prefix.'_knock_out_ralley SET ap = `0`');
db_close();
?>

Aber bissel sehr gewagt ;)
 
Zuletzt bearbeitet:
Ist double ja 100,2

Danke für Deine Antwort, aber leider alle 3 Ideen von Dir gehen nicht :(

Hat noch jemand eine Idee?
 
Die Backticks werden nur bei Namen verwendet, nicht für Werte in der Query. Zahlenwerte bekommen sowieso keine Backticks oder Anführungszeichen.

Fehlermeldung posten.
 
Es gibt keine Fehlermeldung, auch error reporting e all gibt keinen Fehler aus, der cron läuft und macht alles außer ap auf 0
 
Damit man dir helfen kann, solltest Du mal den Inhalt vom Cron hier Posten.

In Zukunft kannst Du auch mal im Forum für das VMS schauen. Da sind etliche Lösungen in
diversen Threads zu vielen Themen.
www.designerscripte.net/

Und @Stonebroke,
im VMS1.2 muss man in einem Cron nicht mehr die DB extra connecten ;)
Auch muss die function nicht includiert werden, da der db_query schon in der function
festgelegt wurde.
PHP:
 <?
db_query('UPDATE '.$db_prefix.'_knock_out_ralley SET ap = `0`');
?>
Das würde schon reichen, um den befehl zu starten.

LG
 
Und @Stonebroke,
im VMS1.2 muss man in einem Cron nicht mehr die DB extra connecten ;)
Auch muss die function nicht includiert werden, da der db_query schon in der function
festgelegt wurde.
PHP:
 <?
db_query('UPDATE '.$db_prefix.'_knock_out_ralley SET ap = `0`');
?>
Das würde schon reichen, um den befehl zu starten.

Wegen fehlender weitreichender Infos hab ich einfach diesen Vorschlag geliefert. ;)

Die Backticks werden nur bei Namen verwendet, nicht für Werte in der Query. Zahlenwerte bekommen sowieso keine Backticks oder Anführungszeichen.

Galt der optischen Verdeutlichung. :)
 
Huhu :D

Sorry das ich jetzt erst wieder schreibe, danke für Eure Antworten, aber leider funzt es immer noch nicht.
Hier mal der ganze cron:

PHP:
<?php
// Ralleydaten auslesen
$knock_out = mysql_fetch_array(db_query('SELECT * FROM '.$db_prefix.'_knock_out_ralleydaten'));

// wenn Ralley aktiv
if ($knock_out['start'] <= time()  $knock_out['ende'] >= time()) {

// inaktive User streichen
$teilnehmer = db_query ('SELECT `uid` FROM '.$db_prefix.'_knock_out_ralley WHERE status = 1 AND ap = 0');
while ($uid = mysql_fetch_array($teilnehmer)) {
db_query ('UPDATE '.$db_prefix.'_knock_out_ralley SET status = 2 WHERE uid = '.$uid['uid'].'');
}

// verbleibende Anzahl an Teilnehmer festlegen
$ueber = mysql_fetch_array(db_query('SELECT COUNT(uid) AS teilnehmer FROM '.$db_prefix.'_knock_out_ralley WHERE status = 1'));
//echo ''.$ueber['teilnehmer'].'';
// wennn noch genügend Teilnehmer vorhanden
if ($ueber['teilnehmer'] > $knock_out['plaetze']) {

// Anzahl der ausscheidenden Teilnehmer festlegen
$ausschluss = round(($ueber['teilnehmer']*$knock_out['prozent']*0.01),0);
$restliche_user = $ueber['teilnehmer'] - $ausschluss;

// überprüfen, ob die Anzahl der ausscheidenen Teilnehmer größer als die Anzahl der Gewinnplätze ist
if ($restliche_user < $knock_out['plaetze']) {
$rest = ($knock_out['plaetze'] - $restliche_user);

$ausscheidung = db_query('SELECT `uid` FROM '.$db_prefix.'_knock_out_ralley WHERE status = 1 ORDER BY ap ASC LIMIT '.$rest.'');
while ($user = mysql_fetch_array($ausscheidung)) {
db_query ('UPDATE '.$db_prefix.'_knock_out_ralley SET status = 2 WHERE uid = '.$user[0].'');
db_query ('UPDATE '.$db_prefix.'_knock_out_ralley SET ap = 0.00');//GEHT NICHT
}
} else {
$ausscheidung = db_query('SELECT `uid` FROM '.$db_prefix.'_knock_out_ralley WHERE status = 1 ORDER BY ap ASC LIMIT '.$ausschluss.'');
while ($user = mysql_fetch_array($ausscheidung)) {
db_query ('UPDATE '.$db_prefix.'_knock_out_ralley SET status = 2 WHERE uid = '.$user[0].'');
db_query ('UPDATE '.$db_prefix.'_knock_out_ralley SET ap = 0.00');//GEHT NICHT
} 
}
}
}
?>

Und die 2 zeilen wo hinten //GEHT NICHT steht, die gehen nicht und geben auch keinen Fehler aus.

Vielen Dank Euch erstmal bis hier hin :)
 
Füge mal nach dem db_query, welches nicht funktioniert, folgenden Code ein, lass den Cron einmal laufen und gib dann das, was in der cron.log.txt steht hier aus. (Liegt dann im selben Verzeichnis wie das Cron-Script)

Code:
file_put_contents("cron.log.txt",mysql_error());

Danach kommst ggf. sogar selbst weiter.
 
Ich vermute mal, dass das ganze Script so nicht laufen wird.

Da fehlt ein logischer Operator und weitere Klammern:
Code:
if ($knock_out['start'] <= time()  $knock_out['ende'] >= time()) {

.. und Einrückungen fehlen auch .. *husthust* ;)
 
Zuletzt bearbeitet:
@homerjay007: Alles am script und crons gehen, und sogar der cron geht.
Bis auf die 2 mal ap auf 0 setzten Zeilen die nicht, sonst geht alles ;)

Hat noch jemand eine Idee?
 
while ($user = mysql_fetch_array($ausscheidung)) {
db_query ('UPDATE '.$db_prefix.'_knock_out_ralley SET status = 2 WHERE uid = '.$user[0].'');
db_query ('UPDATE '.$db_prefix.'_knock_out_ralley SET ap = 0.00');//GEHT NICHT
}

(OT) Nomen est omen: $ausscheidung :ugly:

set ap = 0.00 klingt ja ganz nett, aber wo (bzw. für wen)? Ohne where-Klausel werden ALLE Datensätze geändert, nach dem ersten Durchgang der while-Schleife sind die Werte also futsch. Eine Fehlermeldung ist dabei nicht zu erwarten, es ist ja eine durchaus eine korrekte Anweisung. Ist das aber (an der Stelle) beabsichtigt? Wenn ja: Warum müssen sie bei bei jedem weiteren Schleifendurchlauf schon wieder gelöscht werden?
 
@homerjay007: Alles am script und crons gehen, und sogar der cron geht.
Bis auf die 2 mal ap auf 0 setzten Zeilen die nicht, sonst geht alles ;)

Mit Verlaub, das ist ein Syntaxerror und kann so nicht funktionieren. Wenn das laufen sollte, dann hast du hier ein falsches Script reingestellt ;)

Mach mal ein echo(..) vorm Update und du wirst sehen, dass das nicht erreicht wird. Das ist ja auch der Grund, warum das von NeoGriever vorgeschlagene file_put_contents(..) nicht ausgeführt wird. Durch die eingestellte Fehlerconfig wird nichts ausgegeben, da der Parser bereits einen Fehler meldet und somit keine Ausführung des Codes stattfindet.
 
PHP:
<?php 
// Ralleydaten auslesen 
$knock_out = mysql_fetch_array(db_query('SELECT * FROM '.$db_prefix.'_knock_out_ralleydaten')); 

// wenn Ralley aktiv 
if ($knock_out['start'] <= time()  $knock_out['ende'] >= time()) { 

	// inaktive User streichen 
	db_query ('UPDATE '.$db_prefix.'_knock_out_ralley SET status = 2 WHERE status = 1 AND ap =0'); 


	// verbleibende Anzahl an Teilnehmer festlegen 
	$ueber = mysql_fetch_array(db_query('SELECT COUNT(uid) AS teilnehmer FROM '.$db_prefix.'_knock_out_ralley WHERE status = 1')); 
	//echo ''.$ueber['teilnehmer'].''; 
	// wennn noch genügend Teilnehmer vorhanden 
	if ($ueber['teilnehmer'] > $knock_out['plaetze']) { 

		// Anzahl der ausscheidenden Teilnehmer festlegen 
		$ausschluss = round(($ueber['teilnehmer']*$knock_out['prozent']*0.01),0); 
		$restliche_user = $ueber['teilnehmer'] - $ausschluss; 

		// überprüfen, ob die Anzahl der ausscheidenen Teilnehmer größer als die Anzahl der Gewinnplätze ist 
		$limit = ($restliche_user < $knock_out['plaetze']) ? ($knock_out['plaetze'] - $restliche_user) : $ausschluss; 
		
		db_query ('UPDATE '.$db_prefix.'_knock_out_ralley SET status = 2 WHERE status = 1 ORDER BY ap ASC LIMIT 0, %d', $limit); 
		db_query ('UPDATE '.$db_prefix.'_knock_out_ralley SET ap = 0.00');//GEHT NICHT 
	}
}

ich hab mir mal erlaubt den cron etwas aufzuräumen. mysql kann mehr wie 1 Zeile auf einmal bearbeiten also ein query nur um danach genau diese Zeilen zu bearbeiten ist ziemlich überflüssig.