Stránka 1 z 1

Proč mi nefunguje "like" script

Napsal: 16 říj 2011 21:40
od honzaik
čau napsal jsem si tento script, který zapíše jeden hlas do souboru bud plus nebo minus a je to udělany aby to šlo jen jednou na IP

Kód: Vybrat vše

<?php
function pricteni($soubor_plus, $soubor_minus)
{
    $start = "1";
    if ($_POST["plus"] == TRUE)
    {
        if (file_exists($soubor_plus))
        {
            $old_plus = file_get_contents($soubor_plus);
            file_put_contents($soubor_plus, ++$old_plus, LOCK_EX);
        }
        else if (!file_exists($soubor_plus))
        {
            file_put_contents($soubor_plus, $start, LOCK_EX);
        }
    }
    else if ($_POST["minus"] == TRUE)
    {
        if (file_exists($soubor_minus))
        {
            $old_minus = file_get_contents($soubor_minus);
            file_put_contents($soubor_minus, ++$old_minus, LOCK_EX);
        }
        else if (!file_exists($soubor_minus))
        {
            file_put_contents($soubor_minus, $start, LOCK_EX );
        }
    }
}

function mozek($ip_soubor)
{
    $ip = $_SERVER['REMOTE_ADDR'];
    if (file_exists($ip_soubor))
    {
        $data_ip = file_get_contents($ip_soubor);
        $ips = explode("\n", $data_ip);
        foreach ($ips as $one_ip )
        {
            if ($one_ip == $ip)
            {
                echo "Nemůžeš dále hlasovat";
            }
            else if ($one_ip != $ip)
            {
                pricteni("plus.php","minus.php");
                file_put_contents($ip_soubor, "\n".$ip.$data_ip, LOCK_EX);
            }
        }
    }
    else if (!file_exists($ip_soubor))
    {
        pricteni("plus.php", "minus.php");
        file_put_contents($ip_soubor, "\n".$ip, LOCK_EX);
    }
}

function klik()
{
    if ($_POST["plus"] == TRUE)
    {
        mozek("ips.php");
    }
    else if ($_POST["minus"] == TRUE)
    {
        mozek("ips.php");
    }
}
klik();

?>
<html>
<body>
<center>
<form method="post" action="test_like.php">
      <input name="plus" type="submit" value="LIKE">
      <br>
      <input name="minus" type="submit" value="DISLIKE">
    </form>
</center>
</body>
</html>

podle mě je chyba ve funkci mozek() > foreach, že to provede akci, ikdyž už jedna IP splnila podmínky (nesplnila)

Re: Proč mi nefunguje "like" script

Napsal: 17 říj 2011 00:20
od CZechBoY
co přesně nefunguje, co to dělá/nedělá?

doporučuju nepoužívat ForEach na procházení pole ale:
PHP píše:$ips = explode("\n", $data_ip)
$flip_ips=Array_Flip($ips);
If(IsSet($flip_ips[$ip]))
echo "Už jsi hlasoval";
Else{
//zapsání plus/minus a IP adresy
}

Re: Proč mi nefunguje "like" script

Napsal: 17 říj 2011 16:25
od honzaik
udělá to že když kliknu na like/dislike tak to sice zapíše tu IP, ale ikdyž ta IP už v tom souboru ips.php je tak to pořád přičítá hlasy, ale píše to "Nemůžeš dále hlasovat." takže ono to podle mě sice tu první podmínku jak jsi řekl splní ale pak to přejde na else ikdyž by to nemělo udělat. nějaký die by to nevyřešilo, protože to samozřejmě zruší ostatní.
EDIT: už jsem to vyřešil, akorát tam dělalo neplechu to že ta 1. podmínka měla bejt vyměněná za druhou, díky za snahu

--- Doplnění předchozího příspěvku (17 Říj 2011 18:00) ---

hm tak fail, script funguje výborně dokud v souboru ips.php není víc IP adres než jedna >1,
takže, bych teď rád věděl co použít za foreach, protože očividně foreach prohledá sice IP ale když tam je i jiná IP než ta 1. tak to vybere tu rozdílnou vždy a bere jí jako jedinou, jakou funkci použít místo foreach? to od CzechBoye jsem moc nepochopil do místo foreach, můžeš mi to prosímtě vysvětlit? tu funkci

Re: Proč mi nefunguje "like" script

Napsal: 17 říj 2011 18:51
od CZechBoY
aha.. taky mi unikl takový malý detail že to vypíše "Nemůžeš dále hlasovat" a pak vlastně cyklus pokračuje :D :D =>
dej za to echo "Nemůžeš dále hlasovat"; příkaz break;

Kód: Vybrat vše

<?php
function pricteni($soubor_plus, $soubor_minus)
{
    $start = 1;
    if ($_POST["plus"] == TRUE)
    {
        if (file_exists($soubor_plus))
        {
            $old_plus = file_get_contents($soubor_plus);
            file_put_contents($soubor_plus, ++$old_plus, LOCK_EX);
        }
        else
        {
            file_put_contents($soubor_plus, $start, LOCK_EX);
        }
    }
    else if ($_POST["minus"] == TRUE)
    {
        if (file_exists($soubor_minus))
        {
            $old_minus = file_get_contents($soubor_minus);
            file_put_contents($soubor_minus, ++$old_minus, LOCK_EX);
        }
        else
        {
            file_put_contents($soubor_minus, $start, LOCK_EX );
        }
    }
}

function mozek($ip_soubor)
{
    $ip = $_SERVER['REMOTE_ADDR'];
    if (file_exists($ip_soubor))
    {
        $data_ip = file_get_contents($ip_soubor);
        $ips = explode("\n", $data_ip);
        $flip_ips=Array_Flip($ips);
          if (IsSet($flip_ips[$ip]))
          {
              echo "Nemůžeš dále hlasovat";
              break;
          }
          elseif ($one_ip != $ip)
          {
              pricteni("plus.php","minus.php");
              file_put_contents($ip_soubor, "\n".$ip.$data_ip, LOCK_EX);
          }
    }
    else
    {
        pricteni("plus.php", "minus.php");
        file_put_contents($ip_soubor, "\n".$ip, LOCK_EX);
    }
}

function klik()
{
    if ($_POST["plus"] == TRUE)
    {
        mozek("ips.php");
    }
    elseif ($_POST["minus"] == TRUE)
    {
        mozek("ips.php");
    }
}
klik();

?>
<html>
<body>
<center>
<form method="post" action="test_like.php">
      <input name="plus" type="submit" value="LIKE">
      <br>
      <input name="minus" type="submit" value="DISLIKE">
    </form>
</center>
</body>
</html>

toj e trošku upravený a funkční kod
upraveno: if(file_exists(...)) a potom už netestuj jestli neexistuje, stačí dát prostě ELSE
přidán ten Array_Flip jak jsem psal v minulém postu - doporučuju prostudovat, výborná věc - ve zkratce dělá tohle: prohodí klíče s hodnotami v poli (anglicky key prohodí s value)

Re: Proč mi nefunguje "like" script

Napsal: 17 říj 2011 20:03
od honzaik
díky, ale mě už někdo poradil, že tam mám dát proměnnou boolean a napsat u $one_ip == $ip jako vysledek true a funguje to
ale k tomu tvému, ja se spíš ptal na to IsSet, co to dělá
a nebo mi doporučil místo foreach udělat if(in_array())
nicméně díky

Re: Proč mi nefunguje "like" script

Napsal: 18 říj 2011 00:16
od CZechBoY
moje je rychlejší s tim Flipem, uvidíš ;)
dávat boolean hodnotu do cyklu? kde to jsme? dej tam break; tim s eukončuje cyklus ne nějakou podmínkou
dovedeš ci představit jaký je to zpomalení v případě tisíců řádků?

Re: Proč mi nefunguje "like" script

Napsal: 18 říj 2011 16:38
od honzaik
ok, já jsem to udělal s tou funkcí in_array to funguej jak má...

Re: Proč mi nefunguje "like" script

Napsal: 18 říj 2011 20:30
od CZechBoY
no jak myslíš, zkus si to při větších souborech ;)
označ téma za vyřešené

Re: Proč mi nefunguje "like" script  Vyřešeno

Napsal: 18 říj 2011 21:39
od honzaik
ok dík za pomoc