Autor Zpráva
honzaik
Profil
čau udělal jsem si svůj vlastní like script ale nefunguje mi porovnávání a zapisování IP, když je jích tam víc než jedna
function like()
{
$soubor_plus = "./tests/plus.php";
$soubor_minus = "./tests/minus.php";
$ip = $_SERVER['REMOTE_ADDR'];
$soubor_ips = "./tests/ips.php";
$start = "1";
if ($_POST["plus"] == TRUE)
 {
	if (file_exists($soubor_ips))                        // jestli existuje databáze IPs (ips.php)
	{
		$data_ips = file_get_contents($soubor_ips);
		$data_ips_rare = explode("<br>", $data_ips);
		foreach ($data_ips_rare as $one_ip)
		{
			if ($one_ip == $ip)                                                          // když někdo kliknul na PLUS a je jeho IP už v databázi
			{
			  function hlaska_plus()
			  {
				echo "Už dál nemůžeš hlasovat! Ale jsem rád, že jsi chtěl dát +.";             // hláška, když se někdo snaží hlasovat znova plus
			  }
      }
			else if ($one_ip != $ip)                                                    // když někdo kliknul na PLUS a jeho IP neni v databázi tak
			{
				if (file_exists($soubor_plus))                                               // jestli vůbec existuje soubor plus.php
				{
					$old_plus = file_get_contents($soubor_plus);                               // když existuje tak se načte přechozí číslo
					file_put_contents($soubor_plus, ++$old_plus, LOCK_EX);                     // a zvýší se o jedno
				}
				else if (!file_exists($soubor_plus))                                         // když neexistuje soubor plus.php
				{
					file_put_contents($soubor_plus, $start, LOCK_EX);                            // tak se vytvoří a vloží se do něj začáteční hodnota $start, což je 1
				}
				file_put_contents($soubor_ips, $ip."<br>\n".$data_ips, LOCK-EX);         // jeho IP se přidá do databáze, aby to přístě nemohl udělat znovu
			}
		}    // konec foreach
	}        // konec toho akcí které se provedou jestli existuje ips.php
    else if (!file_exists($soubor_ips))                                                 // jesli neexistuje databáze IP (to by se mělo stát jen jednou, tak se neprovádí ani kontrola IP a jde se hned na zapsání
    {
   		file_put_contents($soubor_ips, $ip."<br>\n", LOCK_EX);
    	if (file_exists($soubor_plus))
    	{
    		$old_plus = file_get_contents($soubor_plus);                               // když existuje tak se načte přechozí číslo
    		file_put_contents($soubor_plus, ++$old_plus, LOCK_EX);                     // a zvýší se o jedno
    	}
    	else if (!file_exists($soubor_plus))
    	{
    		file_put_contents($soubor_plus, $start, LOCK_EX);                            // tak se vytvoří a vloží se do něj začáteční hodnota $start, což je 1
    	}
    }
 }
else if ($_POST["minus"] == TRUE)
{
$soubor_plus = "./tests/plus.php";
$soubor_minus = "./tests/minus.php";
	if (file_exists($soubor_ips))                        // jestli existuje databáze IPs (ips.php)
	{
	$data_ips = file_get_contents($soubor_ips);
	$data_ips_rare = explode("<br>", $data_ips);
	foreach ($data_ips_rare as $one_ip)
	{
		if ($one_ip == $ip)                                                          // když někdo kliknul na MINUS a je jeho IP už v databázi
		{
		  function hlaska_minus()
		  {
			echo "Už dál nemůžeš hlasovat! A nejsem rád, že jsi chtěl dát -.";             // hláška, když se někdo snaží hlasovat znova minus
		  }
    }
		else if ($one_ip != $ip)                                                    // když někdo kliknul na MINUS a jeho IP neni v databázi tak
		{
			if (file_exists($soubor_minus))                                               // jestli vůbec existuje soubor minus.php
			{
				$old_minus = file_get_contents($soubor_minus);                               // když existuje tak se načte přechozí číslo
				file_put_contents($soubor_minus, ++$old_minus, LOCK_EX);                     // a zvýší se o jedno
			}
			else if (!file_exists($soubor_minus))                                         // když neexistuje soubor minus.php
			{
				file_put_contents($soubor_minus, $start, LOCK_EX);                            // tak se vytvoří a vloží se do něj začáteční hodnota $start, což je 1
			}
			file_put_contents($soubor_ips, $ip."<br>\n".$data_ips, LOCK-EX);         // jeho IP se přidá do databáze, aby to přístě nemohl udělat znovu
		}
	}    // konec foreach
    }        // konec toho akcí které se provedou jestli existuje ips.php
    else if (!file_exists($soubor_ips))                                                 // jesli neexistuje databáze IP (to by se mělo stát jen jednou, tak se neprovádí ani kontrola IP a jde se hned na zapsání
    {
	file_put_contents($soubor_ips, $ip."<br>\n", LOCK-EX);
	 if (file_exists($soubor_minus))
	 {
		$old_minus = file_get_contents($soubor_minus);                               // když existuje tak se načte přechozí číslo
		file_put_contents($soubor_minus, ++$old_minus, LOCK_EX);                     // a zvýší se o jedno
	 }
	 else if (!file_exists($soubor_minus))
	 {
		file_put_contents($soubor_minus, $start, LOCK_EX);                            // tak se vytvoří a vloží se do něj začáteční hodnota $start, což je 1
     }
    }
} // konec MINUS
} // konec funkce


prostě u
else if ($one_ip != $ip)  

tam něco nefunguje protože to pak ty liky nasobí atd a do databáze to zapisuje znova, nevíte jak na to?
meris
Profil
Ahoj,
to máš celé špatně.
1) Důvod proč ti to nefunguje:
IP do souboru ukládáš jako "192.168.1.1<br>\n" ale rozděluješ je pro porovnání jen pomocí "<br>". A pak porovnáváš řetězec s ipadresou uživatele "192.168.1.1" s řetezcem v souboru, který vypadá takto: "\n192.168.1.1", které jsou pak různé.
Jinak by to mohlo být funkční.

Teď proč je to celé špatně.
2) definuješ funkce hlaska_(PLUS/MINUS) v IF a nevoláš je, takže se to nikdy nevypíše.
3) definuješ funkce uvnitř jiné funkce.
4) opakueš stejný kód(např zápis do souboru s IP adresami může být na jednom místě.)
To že tomáš napsané takto,je obrovská chyba do budoucna,pokud by jsi tam chtěl přidat či opravit funkce, tak ti to bude strašně komplikovat prác.
honzaik
Profil
díky za radu, ta funkce hláška je tam omylem, já jsem pak udělal funkci hlasky mimo tuhle celou funkci a pak to fungovalo (jen ty hlášky),
a takže to jak udělat to rozdělování, stačilo by udělat <br> a to \n tam vynechat?
a k 4. bodu, no já nevím jak to udělat lépe, protože to všechno na sobě zavisí imho :D
já vim že to mám hrozně špatně udělaný, poupravim to, ale nevidim jak moc bych to upravil aby to bylo lépe "čitelný"
meris
Profil
přepsat? třeba:
/**
 *  funkce vraci pole pouzitych IP adres
 */  
function getIpFromFile ($file = "./tests/ips.php") {
  if (file_exists($file)) {
    $data_ips = file_get_contents($soubor_ips);
    return explode("\n", $data_ips);
  } else {
	  return array();   
	}
}

/**
 *  ulozi do souboru hodnotu o jedna vyssi
 */ 
function saveResultToFile($file){
  if (file_exists($file))  {
    $old_plus = file_get_contents($soubor_plus);   
		file_put_contents($file, ++$old_plus, LOCK_EX);  
  } else {
    file_put_contents($file, 1, LOCK_EX);
  }
}

/**
 * ulozi ip uzivatele co hlasoval
 */ 
function addIpToFile ($ip, $file = "./tests/ips.php"){
  if (file_exists($file)) {
    file_put_contents($file, "\n".$ip, LOCK_EX | FILE_APPEND); 
  } else {
	  file_put_contents($file, $ip, LOCK_EX );
	}
}

function like( $hlas = $_POST['hlas']) {
  $soubor_zapis_vysledek = "";
  $ip = $_SERVER['REMOTE_ADDR'];
  
  switch ($hlas){
	  case "plus" : 
	    $soubor_zapis_vysledek = "./tests/plus.php";
	  break;
	  case "minus" :
	    $soubor_zapis_vysledek = "./tests/minus.php";
	  break;
	  default:
	    echo "neplatny hlas";
	  break;
	}
  
  $ips = getIpFromFile();
  foreach ($ips as $one_ip){
    if ($one_ip == $ip) {
      echo "Už dál nemůžeš hlasovat! A dekuji, že jsi chtěl dát {$hlas}.";
      return;
    }
  }
  
  saveResultToFile($soubor_zapis_vysledek);
  addIpToFile($ip);
}

Není to úplně dokonalé, ale jako nasměrování snad postačujicí.
honzaik
Profil
<?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>

takhle jsem to přepsal nevím jestli je to lepší, ale hlavní problém je, že mi to násobí ty liky a disliky a nezapíše to tu ip jednou
funkce pricteni funguje tak jak má
ten jen musim vymyslet jak udělat ten ip log...
honzaik
Profil
hm podle mě je chyba v tomhle
 $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);
            }
        }

to foreach tam zkontroluje všechny IP né jen jednu, když už splní podmínku
dalo by se to vyřešit tim switchem? popřípadě jak ho to toho mého kódu zařadit
honzaik
Profil
díky za pomoc už jsem to vyřešil, vypadá to že tam dělala problem jedna podmínka
EDIT: tak ne, prostě ta funkce forEach nepracuje tak jak má.. když je v souboru "ips.php" jedna IP tak to tý jedný IP nepovolí už dál (což je správně) ale když se tam připojí někdo jinej s jinou IP tak se IP zapíše ale pak už forEach bere tu 1. IP, která je jiná, než toho druhého uživatele, jako že splnila podmínku, ale já chci aby to projelo všechny data v souboru ips.php a ikdyby $one_IP z mnoha byla stejná jako $ip tak aby to prostě bralo jako else if ($one_ip != $ip)
nevíte někdo jak to vyřešit? popřípadě jinou funkci?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0