←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Pomoc w wykończeniu skrypty pod diablo mod...

Locked

Radeon's Photo Radeon 05.02.2010

UPRZEDAM! W miejsce X P (doświadczenie) powstawialy się idiotyczne emotikony "xP", więc proszę je czytać jako experience.


Witam,


jako że nie chciałbym popełnić jakiegoś błędu i zrobić dziury w skrypcie, to potrzebowałbym pomocy przy pisaniu skryptu, który:

Po podaniu steam_id i wyborze klasy (lub podaniu jej numeru), oraz wartości xP, znajdzie tą postać i doda jej do aktualnego xP daną wartość xP.

Całość opierała by sie na dwóch plikach - panel dodawania i drugi w który wykonuje skrypt :)

Dodawanie xP panel:
<center><? 

echo ' 
<form action="dodajxp.php" method="post"> 
SID:<br /> 
<input type="text" name="sid" value=""><br /> 
Klasa:<br /> 
<input type="text" name="klasa" value=""><br />
Exp:<br />
<input type="text" name="exp" value=""><br />
<br /><br />
<input type="submit" value="dodaj" /> 
</td> 
</tr> 
</table></form>'; 

?></center>

I teraz gorsza sprawa:

Dodawanie xP skrypt:

<?php 

$sid = $_POST['sid']; 
$klasa = $_POST['klasa']; 
$exp = $_POST['exp'];

if($sid and $klasa and $exp) { 

//połączenie z bazą
$connection = @mysql_connect('localhost', 'login', 'hasło') 
or die('Brak połączenia z serwerem MySQL'); 
$db = @mysql_select_db('user_bazy', $connection) 
or die('Nie pykło'); 

//Funkcja sprawdzająca czy istnieje takia osoba w razie błędu wywala połączenie ---- NIE WIEM CZY POPRAWNE
$ins1 = @mysql_query("SELECT * FROM 'tabela_diablo' WHERE sida='$sid' ");
if($ins1) 
{
continue;
}
else echo "Nie pykło"; 

mysql_close($connection); 
} 

//Funkcja szukająca odpowiedniej klasy ---- NIE WIEM CZY POPRAWNE, proszę o sprawdzenie
$ins2 = @mysql_query("SELECT * FROM 'tabela_diablo' WHERE klasa='$klasa' ");

//Stawiam na 99% że jest to źle zrobione, najpierw trzeba wybrać wartość exp i potem dodać, ale nie chcę już źle kompilkować, stawiam 1%, że ktoś tu umie PHP i mi pomoże
$ins3 = @mysql_query("INSERT INTO tabela_diablo SET exp+'$exp'); 

if($ins3) echo "Panie! Udało się!"; 
else echo "I teraz znów Ci nie pykło"; 

mysql_close($connection); 
} 

?>

Jestem ciekaw czy ktoś tutaj pomoże?
Edited by Radeon, 05.02.2010 23:03.
Quote

  • +
  • -
R3X's Photo R3X 05.02.2010

absolutnie źle xD

ani select ani insert tylko UPDATE i możesz używać obecnej wartości pola, więc będzie coś takiego:

UPDATE tabela_diablo SET exp = exp+$exp WHERE sid = '$sid' && klasa = $klasa;


i wszystko z GET musisz zabezpieczyć przed SQL Injection PHP: mysql_real_escape_string - Manual
Quote

Radeon's Photo Radeon 06.02.2010

Dzięki!

Tylko sql injection raczej tutaj nie zastosujesz, gdyż całość będzie dostępna na hasło lub ip ustalone w .htaacces



<?php 

$sid = $_POST['sid']; 
$klasa = $_POST['klasa']; 
$exp = $_POST['exp'];

if($sid and $klasa and $exp) { 

//połączenie z bazą
$connection = @mysql_connect('localhost', 'login', 'hasło') 
or die('Brak połączenia z serwerem MySQL'); 
$db = @mysql_select_db('user_bazy', $connection) 
or die('Nie pykło'); 

//Funkcja sprawdzająca czy istnieje takia osoba w razie błędu wywala połączenie
$ins1 = @mysql_query("SELECT * FROM 'tabela_diablo' WHERE sida='$sid' ");
if($ins1) 
{
continue;
}
else echo "Nie pykło"; 

mysql_close($connection); 
} 

//Funkcja szukająca odpowiedniej klasy
$ins2 = @mysql_query("SELECT * FROM 'tabela_diablo' WHERE klasa='$klasa' ");
if($ins2) 
{
continue;
}
else echo "Tu też nie pykło"; 

mysql_close($connection); 
} 

$ins3 = @mysql_query("UPDATE tabela_diablo SET exp = exp+$exp WHERE sid = '$sid' && klasa = $klasa;'); 

if($ins3) echo "Panie! Udało się!"; 
else echo "I teraz znów Ci nie pykło"; 

mysql_close($connection); 
} 

?> 

Czy może wystarczy samo:

<?php 

$sid = $_POST['sid']; 
$klasa = $_POST['klasa']; 
$exp = $_POST['exp'];

if($sid and $klasa and $exp) { 

//połączenie z bazą
$connection = @mysql_connect('localhost', 'login', 'hasło') 
or die('Brak połączenia z serwerem MySQL'); 
$db = @mysql_select_db('user_bazy', $connection) 
or die('Nie pykło'); 

$ins3 = @mysql_query("UPDATE tabela_diablo SET exp = exp+$exp WHERE sid = '$sid' && klasa = $klasa;'); 

if($ins3) echo "Panie! Udało się!"; 
else echo "I teraz znów Ci nie pykło"; 

mysql_close($connection); 
} 

?> 

Tylko będzie wywalało w drugim błąd mysql w razie braku wpisu z daną klasą lub steam, co brzydko wygląda, ale działać będzie, right? :)
Quote

  • +
  • -
R3X's Photo R3X 06.02.2010

to drugie wystarczy, dałeś @ więc nie będzie komunikatów; żeby sprawdzić czy znalazło czy nie musisz użyć funkcji PHP: mysql_affected_rows - Manual

if($ins3){
	if(mysql_affected_rows($ins3))
		echo "Panie! Udało się!";
	else
		echo "Nie ma takiego SID lub klasy";
}


Fajniej by było z klasą jako <select> kodu php to nie zmieni, a używać będzie łatwiej
<select name="klasa">
	<option value="1">Mag</option>
	<option value="2">Mnich</option>
	<option value="3">Paladyn</option>
	<option value="4">Zabojca</option>
	<option value="5">Nekromanta</option>
	<option value="6">Barbarzynca</option>
	<option value="7">Ninja</option>
	<option value="8">Lowca</option>
</select>
Quote

Radeon's Photo Radeon 06.02.2010

EDIT: Wyprzedziłeś mnie z editem kiedy pisałem posta poniżej :D

Czyli nadal zostaje:
$ins3 = @mysql_query("UPDATE tabela_diablo SET exp = exp+$exp WHERE sid = '$sid' && '$klasa' "); 

Tylko formularz się zmienia?
--------------

A, żeby interpretowało klasy? Lub menu wysuwane i do wyboru klasy (niestety nie umiem takich tworzyć, więc przejde do interpretacji):

jak wpisze paladyn to ustawi mu cyfre 8

to:
if($klasa)='paladyn' SELECT tabela_diablo WHERE sid = '$sid' && klasa = '8' ;'); 

Czy może coś na zasadzie stałych, że jeśli $klasa = paladyn to szukaj klasa 8
if($klasa)='paladyn' {
$ins3 = @mysql_query("UPDATE tabela_diablo SET exp = exp+$exp WHERE sid = '$sid' && klasa = '8';'); 

Tylko wtedy musiałbym stworzyć aż 8 warunków...
Edited by Radeon, 06.02.2010 00:22.
Quote

  • +
  • -
R3X's Photo R3X 06.02.2010

jak do option dodasz value to w $_POST['klasa'] będzie właśnie value, a nie etykieta ;D

tak, zmieniasz tylko forma
Quote

Radeon's Photo Radeon 14.02.2010

Poprawiłem jeszcze kilka błędów i śmiga jak należy :)
Tylko pytanko - jakbym chciał pod dotpay zrobić taki skrypt, tzn płatny dostęp do strony, to jak mogę zablokować dostęp do strony bez wcześniejszego podania kodu? Czy to już w dotpay dają taki skrypt?
Głównie chodzi mi tutaj o sesje - gracz ma ustalone na stałe 20k dodania, wybiera tylko klase i podaje SID i jak doda poprawnie to koniec sesji i nie wejdzie.

Aktualnie korzystam z tego jako dodawanie xP z konkursów dla adminów, zabezpieczone na hasło skryptem java (o dziwo z ustawieniem hasla na .htaccess i .htpsswrd nie dziala..)
Quote
Locked