Proč mi nefunguje "like" script

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Zamčeno
Uživatelský avatar
honzaik
Level 2.5
Level 2.5
Příspěvky: 337
Registrován: 09 říj 2011 12:03
Kontaktovat uživatele:

Proč mi nefunguje "like" script

Příspěvek 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)
ello dere
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: Proč mi nefunguje "like" script

Příspěvek 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
}
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
Uživatelský avatar
honzaik
Level 2.5
Level 2.5
Příspěvky: 337
Registrován: 09 říj 2011 12:03
Kontaktovat uživatele:

Re: Proč mi nefunguje "like" script

Příspěvek 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
ello dere
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: Proč mi nefunguje "like" script

Příspěvek 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)
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
Uživatelský avatar
honzaik
Level 2.5
Level 2.5
Příspěvky: 337
Registrován: 09 říj 2011 12:03
Kontaktovat uživatele:

Re: Proč mi nefunguje "like" script

Příspěvek 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
ello dere
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: Proč mi nefunguje "like" script

Příspěvek 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ů?
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
Uživatelský avatar
honzaik
Level 2.5
Level 2.5
Příspěvky: 337
Registrován: 09 říj 2011 12:03
Kontaktovat uživatele:

Re: Proč mi nefunguje "like" script

Příspěvek od honzaik »

ok, já jsem to udělal s tou funkcí in_array to funguej jak má...
ello dere
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: Proč mi nefunguje "like" script

Příspěvek od CZechBoY »

no jak myslíš, zkus si to při větších souborech ;)
označ téma za vyřešené
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
Uživatelský avatar
honzaik
Level 2.5
Level 2.5
Příspěvky: 337
Registrován: 09 říj 2011 12:03
Kontaktovat uživatele:

Re: Proč mi nefunguje "like" script

Příspěvek od honzaik »

ok dík za pomoc
ello dere
Zamčeno
  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • proč nb nebere boot antivir
    od Stenatko » » v Vše ostatní (bezp)
    5 Odpovědi
    23588 Zobrazení
    Poslední příspěvek od Stenatko
  • Problémy v síti na obrázku - proč nemůžou počítače komunikovat mezi sebou
    od zuzana3 » » v Administrace sítě
    7 Odpovědi
    10372 Zobrazení
    Poslední příspěvek od zuzana3
  • Nefunguje nová PC
    od adoyss » » v Problémy s hardwarem
    7 Odpovědi
    6206 Zobrazení
    Poslední příspěvek od martanius
  • Lenovo S-130 nefunguje touchpad
    od mk7605 » » v Problémy s hardwarem
    21 Odpovědi
    7609 Zobrazení
    Poslední příspěvek od mk7605
  • T490s nefunguje trackpoint UPDATE
    od Sadelník1234 » » v Problémy s hardwarem
    3 Odpovědi
    4218 Zobrazení
    Poslední příspěvek od kecalek

Zpět na „Programování a tvorba webu“