Functie gemaakt in config.php, call in result.php "Cannot redeclare ... "
Ik heb in mijn bestand "config.php" een functie gemaakt om dmv de dag, maand en jaar van geboorte, de leeftijd te berekenen.
In het bestand "result.php" roep ik die functie aan in een tabel, en als ik m dan uitvoer, krijg ik de melding:
Code (php)
1
Fatal error: Cannot redeclare calcAge() (previously declared in /home/u598839215/public_html/config.php:13) in /home/u598839215/public_html/config.php on line 19
Weet iemand wat ik fout doe?
Alvast bedankt.
EDIT: nu ik uitlog en weer inlog, zie ik dat het overal het geval is, niet alleen op result.php :(
Bestanden:
config.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
session_start();
$homepage='http://www.dating.url.ph/';
$sitename='XXXXX';
$mailto='XXXXX';
$SQLhost='XXXXX';
$SQLuser='XXXXX';
$SQLpass='XXXXX';
$SQLdb='XXXXX';
function calcAge($dag, $maand, $jaar) {
$geboortedatum = mktime(0, 0, 0, $maand, $dag, $jaar);
$t = time();
$leeftijdsec = ($geboortedatum < 0) ? ( $t + ($geboortedatum * -1) ) : $t - $geboortedatum;
$leeftijd = floor($leeftijdsec / "31536000");
return $leeftijd;
}
?>
session_start();
$homepage='http://www.dating.url.ph/';
$sitename='XXXXX';
$mailto='XXXXX';
$SQLhost='XXXXX';
$SQLuser='XXXXX';
$SQLpass='XXXXX';
$SQLdb='XXXXX';
function calcAge($dag, $maand, $jaar) {
$geboortedatum = mktime(0, 0, 0, $maand, $dag, $jaar);
$t = time();
$leeftijdsec = ($geboortedatum < 0) ? ( $t + ($geboortedatum * -1) ) : $t - $geboortedatum;
$leeftijd = floor($leeftijdsec / "31536000");
return $leeftijd;
}
?>
result.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
session_start();
include('config.php');
IF (!isset($_SESSION['username'])) { header('Location: '. $homepage); }
IF ($_SESSION['query']== "") { header('Location: matching.php'); }
$con = mysql_connect($SQLhost, $SQLuser, $SQLpass) or die('Could not connect: ' . mysql_error());
mysql_select_db($SQLdb, $con) or die('Could not find database: ' . mysql_error()) ;
$res = mysql_query( $_SESSION['query'] );
IF ($res === false) { echo "query error"; }
?>
<html>
<head>
<title>Matching - <?php echo $_SESSION['username']; ?> </title>
<link rel="icon" type="image/ico" href="/dating/favicon.ico"> </link>
</head>
<body bgcolor="<?php echo $_SESSION['background']; ?>">
<?php include('menu.php'); ?>
<hr>
Query:<br>
<?php echo $_SESSION['query']; ?>
<br><Br>
<b>Matching...</b><br />
We found <?php echo mysql_num_rows($res), " results.<br>";
if (mysql_num_rows($res) == 0) {
echo "Want to match again? <br><br>"; }
else { echo "Results:<br />"; } ?>
<table>
<?php
for ($i=0; $row = mysql_fetch_assoc($res); $i++)
{ echo "<tr><td width=100> ". ($i + 1). ". <a href='profile.php?u=". $row['Username']."'>".$row['Username']." </td>
<td width=150> Age: " . calcAge($row['Dag'], $row['Maand'], $row['Jaar']); echo "</td>
<td> blargh</td></tr>"; }
?>
</table>
<form action="matching.php" method="post">
<input type="submit" value="Match again!"></form>
<hr>
<form action="profile.php" method="post">
<input type="submit" value="Go to my own profile!"></form>
</body>
</html>
session_start();
include('config.php');
IF (!isset($_SESSION['username'])) { header('Location: '. $homepage); }
IF ($_SESSION['query']== "") { header('Location: matching.php'); }
$con = mysql_connect($SQLhost, $SQLuser, $SQLpass) or die('Could not connect: ' . mysql_error());
mysql_select_db($SQLdb, $con) or die('Could not find database: ' . mysql_error()) ;
$res = mysql_query( $_SESSION['query'] );
IF ($res === false) { echo "query error"; }
?>
<html>
<head>
<title>Matching - <?php echo $_SESSION['username']; ?> </title>
<link rel="icon" type="image/ico" href="/dating/favicon.ico"> </link>
</head>
<body bgcolor="<?php echo $_SESSION['background']; ?>">
<?php include('menu.php'); ?>
<hr>
Query:<br>
<?php echo $_SESSION['query']; ?>
<br><Br>
<b>Matching...</b><br />
We found <?php echo mysql_num_rows($res), " results.<br>";
if (mysql_num_rows($res) == 0) {
echo "Want to match again? <br><br>"; }
else { echo "Results:<br />"; } ?>
<table>
<?php
for ($i=0; $row = mysql_fetch_assoc($res); $i++)
{ echo "<tr><td width=100> ". ($i + 1). ". <a href='profile.php?u=". $row['Username']."'>".$row['Username']." </td>
<td width=150> Age: " . calcAge($row['Dag'], $row['Maand'], $row['Jaar']); echo "</td>
<td> blargh</td></tr>"; }
?>
</table>
<form action="matching.php" method="post">
<input type="submit" value="Match again!"></form>
<hr>
<form action="profile.php" method="post">
<input type="submit" value="Go to my own profile!"></form>
</body>
</html>
Gewijzigd op 18/11/2013 15:22:39 door Kevin Zegikniet
include('config.php');
eens in :
include_once('config.php');
Dit verandert niks. Wat zou dat in theorie moeten veranderen, trouwens?
Je include config.php waarschijnlijk meerdere keren.
Gewijzigd op 17/11/2013 00:38:25 door Kevin Zegikniet
Dat lijkt me dus 2x.
Je begrijpt me wel.
Gewijzigd op 17/11/2013 01:08:47 door Kevin Zegikniet
Nee, eigenlijk niet. De foutmelding geeft aan dat je het bestand meer dan 1x include, dus je moet even je code goed nalopen. Ergens include je het bestand dubbel.
Enige probleem is dus dat ik die functie aanroep, en ik meende dat dat dus de error was...
Maar niet dus. Ik weet absoluut zeker dat ik 'm maar 1x include, en dat is dus ook wat ik zo vreemd vind...
De "je begrijpt me wel" was eigenlijk bedoeld op mijn " maar 1x, en 1x alleen" waar ik mee bedoelde: "1x zeker weten".
Gewijzigd op 17/11/2013 01:32:43 door Kevin Zegikniet
maar welke foutmelding krijg je nu dan?
dezelfde nog steeds... (ik heb de functie nu met #'jes weggecommentaard zodat de rest wel werkt, maar daarvoor heb ik met include_once ook geprobeerd: totaal geen verschil)
Fatal error: Cannot redeclare calcAge() ...
Heb je toevallig in een ander bestand een functie staan met precies dezelfde naam? Zo ja, dan is dat het probleem. Hernoem jouw functie eens naar calculateAge en kijk of de foutmelding dan verdwijnt.
Gewijzigd op 17/11/2013 01:43:33 door Ozzie PHP
Fatal error: Cannot redeclare calcAge()
(previously declared in
/home/u598839215/public_html/config.php:13) in
/home/u598839215/public_html/config.php on line 19
ik heb het even onderelkaar gezet:
je ziet daar dat hij klaagt over de functie calcAge() die in config.php op regel 13 staat, en dat die eerder *in precies hetzelfde bestand config.php* gedefinieerd is op regel 19.
regel 19 is de afsluitende regel en 13 het begin.
Je zult dus echt wel het betreffende bestand 2x (of vaker) includen.....
waarschijnlijk in een ander ge-include bestand, maar toch wel zeker vaker. PHP verzint dat niet natuurlijk...
Door zoek alle bestanden eens op "config.php" en zie waar die overal opduikt (met include of met include_once.)
Waarschijnlijk zul je op meer plaatsen include_once moeten gebruiken, of even nadenken over een logische plek waar je altijd langs komt (bovenaan index.php?) en waar je het configbestand dan eenmalig inleest.
Wat staat er in menu.php?
Toevoeging op 17/11/2013 14:15:37:
aan de foutmelding te zien is dat niet het geval maar ga je inderdaad twee keer je config.php includen.
Je kunt het wel voorkomen door include_once('config.php'); te gebruiken.
Gewijzigd op 17/11/2013 14:16:01 door Frank Nietbelangrijk
Ik heb in elk bestand een include('config.php'); (nu dus _once erbij) staan. Ik begrijp dat dat niet moet? (lijkt me niet erg logisch, omdat elke pagina apart is, maar ik kan dus fout zitten).
Dan snap ik ook waarom ie eerder niet foutmeldingen maakte, omdat variabelen aanpassen geen probleem is.
Obelix en Idefix
Daar staat puur wat html - wacht fuck. Daar staat ook include config... oeps.
Daar staat dus wat html en een include... Domme ik.
Frank
Zie bovenstaande.
Ik heb menu nu aangepast, en de include eruit gehaald.
Gevolg is nu dat de error blijft komen in result, alleen is de error van lijn 13 nu opgeschoven naar 14 (ook al staat de 'function calcAge(...) {' nog steeds op lijn 13. Lijn 19 is wel hetzelfde.
Vreemd vind ik ook dat ik het ook toepas op profile.php, waar ik ook include_once('config.php'); EN ook include('menu.php'); doe. Maar daar werkt ie wel gewoon naar behoren.
EDIT:
wat ben ik een stomkop.
Ik had dezelfde functie in het script zelf gehardcode, maar was ik glad vergeten...
*facepalm*
Sorry jongens!
Kevin Zegikniet op 18/11/2013 14:13:02:
EDIT:
wat ben ik een stomkop.
Ik had dezelfde functie in het script zelf gehardcode, maar was ik glad vergeten...
*facepalm*
Sorry jongens!
wat ben ik een stomkop.
Ik had dezelfde functie in het script zelf gehardcode, maar was ik glad vergeten...
*facepalm*
Sorry jongens!
Ozzie PHP op 17/11/2013 01:43:14:
Heb je toevallig in een ander bestand een functie staan met precies dezelfde naam? Zo ja, dan is dat het probleem. Hernoem jouw functie eens naar calculateAge en kijk of de foutmelding dan verdwijnt.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT
TIMESTAMPDIFF(YEAR, birthdate, CURRENT_DATE) age,
first_name,
last_name
FROM
members
WHERE birthdate BETWEEN (CURRENT_DATE - INTERVAL 30 YEAR) AND (CURRENT_DATE - INTERVAL 20 YEAR)
TIMESTAMPDIFF(YEAR, birthdate, CURRENT_DATE) age,
first_name,
last_name
FROM
members
WHERE birthdate BETWEEN (CURRENT_DATE - INTERVAL 30 YEAR) AND (CURRENT_DATE - INTERVAL 20 YEAR)
Gewijzigd op 18/11/2013 17:22:03 door Ger van Steenderen
Hoe ik het wel doe: ik heb bij leeftijd twee lijstjes met leeftijden (getallen van 20 - 80 interval 5), en in de database heb ik per persoon 3 kolommen dag-maand-jaar (getallen) van zijn/haar geboortedatum.
Aan de hand van die twee lijstjes heb ik de volgende query opgesteld voor de leeftijden:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
if ($_POST['age'] != "<>")
{ $sql_match .= "AND Jaar <= ".( date("Y") - $_POST['agemin'] )." AND (
(Maand = ".date("m")." AND Dag <= ".date("d").")
OR (Maand < ".date("m")." ) )
AND ( ( Jaar >= ". (date("Y") - $_POST['agemax']) .") OR
( Jaar >= ". (date("Y") - $_POST['agemax'] - 1) ." AND (
( Maand > ".date("m")." ) OR ( Maand = ".date("m")." AND Dag > ".date("d") .")
) ) ) " ; }
{ $sql_match .= "AND Jaar <= ".( date("Y") - $_POST['agemin'] )." AND (
(Maand = ".date("m")." AND Dag <= ".date("d").")
OR (Maand < ".date("m")." ) )
AND ( ( Jaar >= ". (date("Y") - $_POST['agemax']) .") OR
( Jaar >= ". (date("Y") - $_POST['agemax'] - 1) ." AND (
( Maand > ".date("m")." ) OR ( Maand = ".date("m")." AND Dag > ".date("d") .")
) ) ) " ; }
Dus: makkelijk doen is al moeilijk genoeg ;)
Lach me maar uit, jongens
Gewijzigd op 18/11/2013 18:06:16 door Kevin Zegikniet
Maar door de geboorte datum een date datatype te geven, zal je query vele malen sneller maken.
De terugkerende AND OR constructies hebben meestal tot gevolg dat je een full table scan krijgt.
Daarnaast heb je in de database al een datum staan en hoef je deze niet eerst in PHP te genereren met gegevens die je uit de db haalt.
En je kunt er ook nog eens op sorteren, indien gewenst.