Avatar billede xsix Nybegynder
03. juni 2009 - 16:18 Der er 14 kommentarer og
1 løsning

Funktioner med argumenter

Hej eksperter.
Jeg har en funktion hvor den første del ser således ud:

function get_stats($user_id) {
require_once('connect.php');
$hero_query = mysql_query("SELECT * FROM heroes WHERE userid = '$user_id'");
$hero_data = mysql_fetch_assoc($hero_query);


Jeg bruger så funktionen i anden fil hvor jeg includer den og så kører funktionen således her:

include('stats.php');
get_stats($_SESSION['user_id']);


Men når jeg så kører dette, har mine variabler i funtionen ingen værdier, kan ikke rigtig se hvad jeg gør galt?
Avatar billede xsix Nybegynder
03. juni 2009 - 16:20 #1
Det virkede fint førhen da jeg ikke havde det som en funktion men blot inkluderede den og så kørte query'et som:
$hero_query = mysql_query("SELECT * FROM heroes WHERE userid = '$_SESSION[user_id]'");
Avatar billede dkfire Nybegynder
03. juni 2009 - 18:31 #2
Du bør ikke have require_once('connect.php') i din funktion, flyt den uden for din funktion, men behold den i samme fil som funktionen.
Dernæst kan du tjekke om din sql virker ved brug af "or die(mysql_error())"
Og har du mere i din funktion, siden du kan sige dine variabler ikke indeholder noget ?
Avatar billede xsix Nybegynder
03. juni 2009 - 18:56 #3
Ja, har meget mere i min funktion.
Men jeg fandt ud af det, det er fordi variabler jo er begrænset til inde i funktionen, så virker de ikke hvis man kalder dem udefra.
Jeg har derfor lavet dem alle til globals.
Avatar billede showsource Seniormester
03. juni 2009 - 19:34 #4
get_stats($user_id) :
$user_id er så din var.
Og hvis du bruger
$_SESSION['user_id']
burde det umiddelbart virke, da $_SESSION er en "super globasl", mener jeg da, men måske der er gået bøf i den fordi serveren har register_globals sat til, så når du har "user_id" som var, og samtidig bruger den i en session, er det måske derfor ?
Måske
$_SESSION["user_id"]
ville virke, men det er et skud i tågen.

Uanset, så er det ikke nødvendigt at bruge "global" til "super globals"
Avatar billede dkfire Nybegynder
03. juni 2009 - 19:43 #5
Det er rigtig dårlig programmeringsstil og meget skidt design hvis du er nød til at lave variabler for globale.
Man bør aldrig lave kode som kalder variabler som hører til en funktion. Enten skal du bruge return eller også skal du læse lidt på hvordan man bruger argumenter som referencer i funktions kald.
http://dk2.php.net/manual/en/functions.arguments.php#functions.arguments.by-reference
Avatar billede xsix Nybegynder
03. juni 2009 - 20:00 #6
Det er muligt at det er dårlig programmeringsstil, men jeg er nok for doven til at skulle sidde og lave returns til alle mine variabler inde i funktionen, da jeg har over 44 variable der så skulle returnes inde i en switch med 4 forskellige resultater, der jo så hver især har 44 variabler.
Avatar billede repox Seniormester
04. juni 2009 - 00:43 #7
Du returnerer vel bare et array med dine 44 resultater? Det er da ligeså nemt og mere fleksibelt end det du er ved at rode dig ud i nu. Og tidsforbruget på at lave alle variablerne i dit funktionsscope globale kunne ligeså godt være blevet lagt i et array.
Avatar billede xsix Nybegynder
04. juni 2009 - 10:20 #8
Hmm det er selvfølgelig rigtigt, vel jeg lige prøve, hvis du vil have point, opretter jeg gerne et nyt spørgsmål :)
Avatar billede repox Seniormester
04. juni 2009 - 10:28 #9
Skidt med pointene. Bare du får lavet tingene ordentligt - det er den måde du vil udvikle dig på.
Avatar billede xsix Nybegynder
04. juni 2009 - 10:49 #10
Nu har jeg fået den til at virke det ene sted, men den vil ikke rigtig lade mig kalde funktionen inde i en anden funktion.
Avatar billede repox Seniormester
04. juni 2009 - 10:52 #11
Du bliver nød til at vise et eksempel på hvad det er der ikke virker for dig. På den måde kan vi nemmere se om du referer forkert eller om det er noget andet.
Avatar billede xsix Nybegynder
04. juni 2009 - 11:04 #12
Jeg har min funktion jeg nu har fixet med et array:


stats.php
function get_stats($user_id) {
$hero_query = mysql_query("SELECT * FROM heroes WHERE userid = '$user_id'");
$hero_data = mysql_fetch_assoc($hero_query);

//Indsættelse af data i arrayet som hedder $stats
Fx.
$stats['attackpower_str_multi'] = 2;
$stats['attackpower_total'] = ($hero_data[str]*$stats['attackpower_str_multi']) + ($hero_data[b_str]*$stats['attackpower_str_multi']);
$stats['damage_multi'] = 16;
$stats['damage_total'] = ($attackpower_total / $stats['damage_multi']);

return $stats;



Så har jeg denne funktion hvor alle de data jeg bruger fra stats.php kommer frem som 0:


attack.php
include('stats.php');
function attack($p1, $p2) {
$query = mysql_query("SELECT * FROM heroes WHERE userid='$p1'");
$p1_data = mysql_fetch_assoc($query);
$query_two= mysql_query("SELECT * FROM heroes WHERE userid='$p2'");
$p2_data = mysql_fetch_assoc($query_two);

$p1_stats = get_stats($p1_data['userid']);
$p2_stats = get_stats($p2_data['userid']);



Så sker det en masse udregninger med disse variabler, som alle giver 0. Et eksempel på en af disse "udregninger" er:
$p1_hit_damage = $p1_stats['damage_total'];

Resultater af alle disse udregninger bliver så sat ind i en variable som bliver returnet.

Jeg kalder så denne funktion længere nede:

$attack_r1 = attack($_SESSION['user_id'], $_GET['u']);
echo $attack_r1;

Dette bliver echo'et helt fint, dog alle de steder hvor der burde være højere tal, står der bare 0.


stats.php virker helt fint et andet sted hvor jeg benytter den, så tror ikke det er den der er noget galt med. Jeg har også prøvet at bruge include('stats.php'); både inde og uden for selve funktionen.
Avatar billede repox Seniormester
04. juni 2009 - 11:13 #13
Og du er helt sikker på at dine kald til alle dine funktioner returnerer hvad du forventer?

Returner attack($_SESSION['user_id'], $_GET['u']) det ønskede? Hvis nej, så find ud om funktionen gør hvad du ønsker (det kaldes bugfixing).

Hvis den gør det ligger fejlen nok i get_stats() funktion.
Avatar billede xsix Nybegynder
04. juni 2009 - 11:33 #14
Haha, jeg fik det til at virke, men forstod ikke helt hvad du mente og var ret sikker på at du tog fejl med at der var noget galt med get_stats() funktionen, så jeg gik i gang med at echo teste alle mine variabler, og sjovt nok, så virkede de alle bortset fra damage, jeg fandt så ud af at under udregningen til damage i get_stats() funktionen, havde jeg glemt at ændre det til array.

Irriterende at så nogle små fejl ofte kræver så stort et arbejde at finde, men du skal have mange tak for din hjælp repox. Hvis du vil have point, opretter jeg gerne et nyt spørgsmål så du lige kan få dem :)
Avatar billede repox Seniormester
04. juni 2009 - 11:39 #15
Behold du bare dine point, det vigtigste er jo at du fik det til at virke ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester