Autor Zpráva
mmapro
Profil
Ahoj, mam zase menší problém, který řešim a sám to asi nedám dohromady protože, jsem ty soubory přehrál asi 3x atd a furt nic, furt samá hláška. Hodim sem odkaz, kde ta chyba je a kod, takže je to zde: http://mmaprofighter.org/cron.php
a kod je zde:
<?php
ob_start();
session_start(); 
if(file_exists("./install.php")) {
    header("Location: ./install.php");
} 
include("includes/config.php");
include("includes/functions.php");
// get web settings 
$web = mysql_fetch_row(mysql_query("SELECT * FROM settings ORDER BY id DESC LIMIT 1"));

function check_premium_expire() {
    $time_now = time();
    $sql = mysql_query("SELECT * FROM premium_history ORDER BY id") or die(mysql_error());
    if(mysql_num_rows($sql)>0) {
        while($row = mysql_fetch_array($sql)) {
            if($time_now > $row['premium_expire']) {
                $update = mysql_query("UPDATE users SET premium='0' WHERE id='$row[user_id]'") or die(mysql_error());
                $delete = mysql_query("DELETE FROM premium_history WHERE id='$row[id]'") or die(mysql_error());
            }
        }
    }
}

function check_tournaments_end() {
    $time_now = time();
    $sql = mysql_query("SELECT * FROM tournaments WHERE $time_now > end_time and winner='0' ORDER BY id") or die(mysql_error());
    if(mysql_num_rows($sql)>0) {
        while($row = mysql_fetch_array($sql)) {
            $tour_players = tour_players($row['id']);
            $get_winner = mysql_query("SELECT * FROM users WHERE id IN ($tour_players) ORDER BY total_stats DESC LIMIT 1") or die(mysql_error());
            $get_winner = mysql_fetch_array($get_winner);
            $winner = $get_winner['id'];
            $update = mysql_query("UPDATE users SET tournaments_won=tournaments_won+1 WHERE id='$winner'");
            $update = mysql_query("UPDATE tournaments SET winner='$winner' WHERE id='$row[id]'") or die(mysql_error());
        }
    }
}

check_premium_expire();
check_tournaments_end();
?>

vůbec nevi kde by mogl být problém, je možný, že je to třeba v MySQL?
Tori
Profil
Funkce tour_players vrací něco jiného, než čekáte, tím vznikne druhá chyba v SQL. První chyba (s implode) je někde na řádku 82 ve functions.php
Fisir
Profil
Reaguji na mmapra:
Ano, problém je v MySQL. Problém je v dotazu na řádku 31, zkus proměnnou $tour_players escapovat. Příště prosím nepoužívej rozšíření mysql_*. Jak říkala Tori, chyba s implode je v jiném souboru, ale je možné, že se po vyřešení chyby v dotazu odstraní i tahle.
mmapro
Profil
muže mi stim někdo pomoct? escapovat neumim, jsem začátečník
lionel messi
Profil
Definitivní příručka escapování
mmapro
Profil
Nějak mi to nejde, jinak zde je ten function.php (75 až 84řádek)
}

function tour_players($id) {
    $query = mysql_query("SELECT * FROM tournaments_players WHERE tour_id='$id'");
        while($row = mysql_fetch_array($query)) {
            $subs[] = $row['user_id'];
        }
    return implode(',', $subs);
}
?>
lionel messi
Profil
Skús na začiatok cyklu:

extract($row);
$subs[] = $user_id;
Fisir
Profil
Reaguji na lionela messiho:
To je blbost. Kde definuješ proměnnou $user_id?
lionel messi
Profil
Fisir:
To je blbost. Kde definuješ proměnnou $user_id?
Upravené, pridal som funkciu extract. Vďaka za upozornenie.
mmapro
Profil
dal jsem to tam, kam jsi psal, že to mam dát, a vypisuje to Warning: extract() expects parameter 1 to be array, null given in /DISK2/WWW/mmaprofighter.org/www/includes/functions.php on line 76 Warning: implode(): Invalid arguments passed in /DISK2/WWW/mmaprofighter.org/www/includes/functions.php on line 83 Va-Bąe syntaxe je nějaká divná bl-Bízko ') ORDER BY total_stats DESC LIMIT 1' na řádku 1
Tori
Profil
mmapro:
K [#6]: Před řádkem č.5 musí být $subs = array();. Jinak totiž v případě, že SQL dotaz nic nenajde, nebyla proměnná $subs definovaná.
Druhou chybu odstraníte tím, že řádky 31-35 (v kódu v [#1]) dáte do podmínky, aby se provedly pouze pokud $tour_players je neprázdná.
A možná bych úplně vynechala funkci tour_players a spojila její SQL s dotazem na zjištění vítěze (ale to je jen návrh na vylepšení, není to nutné a s chybou to nesouvisí).


Ještě poznámka: bylo by dobré si ujasnit, jestli může (z pohledu návrhu DB) existovat zápas, u kterého nejsou uloženi žádní hráči. Pokud ne, tak máte v DB nějakou nekonzistenci, že tabulka tournaments obsahuje ID zápasu, kterému v té vazební tournaments_players nejsou přiřazeni hráči. Pokud může existovat, je potřeba s touto možností v kódu počítat (např. tou definicí výchozí prázdné hodnoty do $subs).

edit2: Z pohledu návrhu funkce by spíš měla tour_players vracet to původní pole $subs (jako výchozí dat. strukturu pro skupinu hodnot), a na csv to převádět až před vkládáním do SQL. Ale není to chyba funčnosti.
mmapro
Profil
Jasný, rozhodně už je to lepší, píše to jen Va-Bąe syntaxe je nějaká divná bl-Bízko ') ORDER BY total_stats DESC LIMIT 1' na řádku 1
<?php
function protect($string) {
    $protection = htmlspecialchars(trim($string), ENT_QUOTES);
    return $protection;
}

function success($text) {
    echo '<br><div style="font-weight:bold;color:green;">'.$text.'</div><br>';
}

function error($text) {
    echo '<br><div style="font-weight:bold;color:red;">'.$text.'</div><br>';
}

function isValidUsername($str) {
    return preg_match('/^[a-zA-Z0-9-_]+$/',$str);
}

function isValidEmail($str) {
    return filter_var($str, FILTER_VALIDATE_EMAIL);
}

function percent($num_amount, $num_total) {
        $count1 = $num_amount / $num_total;
        $count2 = $count1 * 100;
        $count = number_format($count2, 0);
        return $count;
}

function timeago($datefrom) {
    global $lang;
    $date = $datefrom-time();
    $minutes = floor($date/60);
    if($minutes == 1) {
        return '1 '.$lang[minute];
    } elseif($minutes == 0) {
        return floor($minutes/60).' '.$lang[seconds]; 
    } else {
        return $minutes.' '.$lang[minutes];
    }
}

function expire($datefrom) {
    global $lang;
    $date = $datefrom-time();
    $days = floor($date / 60 / 60 / 24);
    $hours = floor($date / 60 / 60);
    $minutes = floor($date / 60 / 10);
    if($days > 0) { if($days == 1) { $string_days = '1 '.$lang[day].', '; } else { $string_days = $days.' '.$lang[days].', '; } } else { $string_days = ''; }
    if($hours > 0) { if($hours == 1) { $string_hours = '1 '.$lang[hour].', '; } else { $string_hours = $hours.' '.$lang[hours].', '; } } else { $string_hours = ''; }
    if($minutes > 0) { if($minutes == 1) { $string_minutes = '1 '.$lang[minute]; } else { $string_minutes = $minutes.' '.$lang[minutes]; } } else { $string_minutes = ''; }
    return $string_days.$string_hours.$string_minutes;
}

function curPageURL() {
 $pageURL = 'http';
 if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
 $pageURL .= "://";
 if ($_SERVER["SERVER_PORT"] != "80") {
  $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
 } else {
  $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
 }
 $expl = explode("/?",$pageURL);
 return $expl[0];
}

function get_requests($user_id) {
    $query = mysql_query("SELECT * FROM requests WHERE request_id='$user_id'");
        $subs[] = $user_id;
        while($row = mysql_fetch_array($query)) {
            $subs[] = $row['user_id'];
        }
    return implode(',', $subs);
}

function tour_players($id) {
    $query = mysql_query("SELECT * FROM tournaments_players WHERE tour_id='$id'");
    $subs = array();
        while($row = mysql_fetch_array($query)) {
            $subs[] = $row['user_id'];
        }
    return implode(',', $subs);
}
?>
Rfilip
Profil
$tour_players má na 30 řádku úvodního kodu jakou hodnotu?
mmapro
Profil
Zde je řádek 25 až 31 z cron.php (úvodní kod)
function check_tournaments_end() {
    $time_now = time();
    $sql = mysql_query("SELECT * FROM tournaments WHERE $time_now > end_time and winner='0' ORDER BY id") or die(mysql_error());
    if(mysql_num_rows($sql)>0) {
        while($row = mysql_fetch_array($sql)) {
            $tour_players = tour_players($row['id']);
            $get_winner = mysql_query("SELECT * FROM users WHERE id IN ($tour_players) ORDER BY total_stats DESC LIMIT 1") or die(mysql_error());
Tori
Profil
mmapro:
rozhodně už je to lepší, píše to jen Va-Bąe syntaxe je nějaká divná
Viz: tady
mmapro
Profil
Tak to neni kodem, ale nečim v DB v tabulce turnament, když je prazdná tak cron jede, ale jak nahraju DB tak to píše zas tu chybu
a při nahrání tohle

asi to je těma čárkama, píše to chybu
Va-Bąe syntaxe je nějaká divná bl-Bízko ') ORDER BY total_stats DESC LIMIT 1' na řádku 1
a když smažu obsah tý tabulky turnaments tak zas vse ok
Alphard
Profil
Nečetl jsem celý začátek, předpokládám, že se bavíme o dotazu [#14] mmapro
mysql_query("SELECT * FROM users WHERE id IN ($tour_players) ORDER BY total_stats DESC LIMIT 1")

Když je tabulka tournaments prázdná, první select vrátí prázdný výsledek výsledek a ten druhý (zde citovaný) se vůbec neprovádí..., to jen k vysvětlení příčiny. Podstatu problému vám už říkala i připomínala Tori, dokonce vám napsala i jak to vyřešit. Je třeba zajistit, aby se dotaz neprováděl s prázdným $tour_players.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: