Vorderingen gaan gestaag

Status
Niet open voor verdere reacties.

Radio247

Gebruiker
Lid geworden
8 dec 2011
Berichten
31
Bij het herbouwen van de website heb ik inmiddels de “gewone” pagina’s klaar en ben met het gecompliceerde begonnen.
Dat is o.a. de top20 stemlijst welke werkt met een gewone php pagina waar een connect.php wordt geincluded en een function.php pagina wordt required.
Ik heb geen ervaring met includen maar zo goed als mogelijk de delen aangepast en houd nu enkele fout meldingen over.
Hieronder de stemlijst.php scripting.

PHP:
// start de sessie.
session_start();

// configuratie bestand includen.
include '../connect.php';
require 'functies.php';

// maak verbinding met de MySQL server.
#$verbinding = mysqli_connect($DBhost, $DBuser, $DBpass);
mysqli_select_db($conn, $dbname);

// het aantal seconden in een week.
$secPerWeek = 604800;

// de bezoeker wil stemmen op een nummer in de stemlijst.
if (isset($_GET['stem']))
{
	// moet er ingelogd worden voordat de bezoekers
	// kunnen stemmen om de stemlijst?
	if (stemlijst_var('login') == 'Y')
	{
		// als de gebruiker niet is ingelogd stuur
		// deze dan door naar de login pagina.
		if (!is_ingelogd())
		{ echo "<meta http-equiv=\"refresh\" content=\"0; URL=../users/login.php?stem=$_GET[stem]\">"; exit(); }
	}
}

?>

<html>
<head>
<title>Stemlijst</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="style.css" rel="stylesheet">
<meta http-equiv="imagetoolbar" content="no">
</head>

<body topmargin="5" bgcolor="#DEDEDE">

<font class="headerText">De InternetTop20</font><br>
<font class="normText">Bepaal zelf wie er op nummer 1 komt door jouw stem uit te brengen! Dit kun je elke dag doen! 
<a href="../top20.php?lezen=Y">Klik hier</a> voor uitleg over de werking van onze Top20.<br><br>


<?php

if(isset($_GET['stem']))
{
	// controleer of het aangegeven nummer wel een
	// getal is en of dit nummer wel in de lijst voorkomt.
	if (is_numeric($_GET['stem']) && in_lijst($_GET['stem']))
	{
		$laaste_gestemt = kan_stemmen();
		if (kan_stemmen())
		{
			// plaats de stem.
			stem($_GET['stem']);
			echo '<div class="stemlijst_gestemt">Jouw stem is toegevoegd!</div>';
		}
		else 
		{
			// de gebruiker kan op dit moment niet stemmen,
			// want dat heeft de gebruiker al gedaan.
			echo '<div class="stemlijst_algestemt">Jij hebt vandaag al gestemd, morgen mag je weer!</div>';
		}
	}
}

// Laatst gestemdeplaat enz. weergeven!
if(isset($_SESSION['user']['userid']))
{
	// Tonen laatst gestemde plaat enz.
	haallaatstestemplaat_uit_leden();
}

// geef de hele stemlijst weer.
stemlijst_weergeven();

De foutmelding die ik krijg op de functie is in eerste instantie verklaarbaar… Bij het maken van de ‘result’ staat geen $conn vermeld voor contact met de database, echter wanneer ik die wel plaats krijg ik de melding dat conn niet is gedefinieerd zelfs wanneer ik de connect.php in de functie pagina include.
Kan / wil iemand mij op weg helpen of uitleggen wat er fout gaat?
Hieronder functies.php

PHP:
/**
 * Haal de waarde van een bepaalde stemlijst optie
 * uit de database.
 *
 * @param string $sleutel	- De sleutel voor de variable.
 * @param bool $bool		- De waardes 'Y' en 'N' omzetten naar boolean waardes.
 * @return mixed
 */
function stemlijst_var($sleutel, $bool = false)
{
	// voer de sql query uit.
	$sql = "SELECT waarde FROM cpl_stemlijst_vars WHERE sleutel = '$sleutel';";
	if ($result = mysqli_query($sql))
	{
		// kon de variable worden gevonden?
		if (mysqli_num_rows($result) > 0)
		{
			$waarde = mysqli_result($result, 0, 'waarde');
			
			// moeten 'Y' en 'N' worden omgezet naar boolean waardes?
			if ($bool)
			{
				if ($waarde == 'Y') $waarde = true;
				if ($waarde == 'N') $waarde = false;
			}
			
			// de waarde terug geven.
			return $waarde;
		}
	}
	// de variable kon niet worden gevonden, wanneer Y en N moeten
	// worden omgezet naar boolean waardes zal 'false' worden terug
	// gegeven, als dit niet hoeft word er niets (null) terug
	// gegeven.
	return ($bool) ? false : null;
}
 
Je gebruikt hier functies, en dan zijn buitenstaande variabelen niet bruikbaar, tenzij het globals zijn ($_POST, $_GET, $_SERVER etc..)

De oplossing:
- Geef ze mee als parameter in de functie.
Code:
function stemlijst_var($sleutel, $bool = false, $conn) {..

- Of plaats ze als global in de functie:
Code:
function stemlijst_var($sleutel, $bool = false) {
global $conn;

- Gebruik de standaard GLOBALS-array voor je connectie en buitenstaande variabelen: $GLOBALS['connection'].
 
Laatst bewerkt:
Dank

Dit was inderdaad de oplossing voor het probleem.
Helaas blijkt nu dat er bijna geen enkele werkende functie aanwezig is en ik dus stap voor stap alles zal moeten gaan proberen te herschrijven met mijn gebrekkige php kennis....
Gaat dus lange tijd duren voor alles werkt maar... niet geschoten is altijd mis...
:p
 
Wat wordt er dan niet ondersteund? Je gebruikt al mysqli, zie ik :)
 
Je verandert in regel 23/24 het type van een variabele, dat is niet 'netjes'.
PHP:
if ($waarde == 'Y') $waarde = true;
if ($waarde == 'N') $waarde = false;

Je verhelpt dit door regel 16 t/m 29 te vervangen door:
PHP:
if (mysqli_num_rows($result) > 0)
{
    $waarde = mysqli_result($result, 0, 'waarde');
    // return boolean true ('Y') of false ('N')
    if ($bool) return ($waarde == 'Y');
    // return string 'Y' of 'N'
    return $waarde;
}
 
Laatst bewerkt:
vraag.

Ik heb inmiddels een functie geschreven en een test bestand om deze aan te roepen en dus uit te lezen.
Helaas gaat er iets mis in de aanroep denk ik.
Bij het aanroepen wil ik de functie in een tabel laten kijken en dan een bij behorende cel laten lezen en weergeven.
Helaas krijg ik de terug melding dat ik een kolom probeer aan te roepen in plaats van de cel in de kolom.

PHP:
function stemlijst_var($sleutel, $bool = false)
{global $conn;
	// voer de sql query uit.
	$sql = "SELECT waarde FROM cpl_stemlijst_vars WHERE sleutel = $sleutel;";
	$result = $conn->query($sql) or die($conn->error);
    while ($waarde = $result->fetch_assoc())
		{
#        echo $row['waarde']."<br>";
 		}			
			// moeten 'Y' en 'N' worden omgezet naar boolean waardes?
    // return boolean true ('Y') of false ('N')
    if ($bool) return ($waarde == 'Y');

			// de waarde terug geven.
			return $waarde;
}

en het bij behorende (test) bestand.

PHP:
include 'connect.php';
include 'testfunctie.php';

stemlijst_var('totaal_nummers');

echo $waarde;

de melding die ik krijg is onderstaande:
"Unknown column 'totaal_nummers' in 'where clause'.

Graag een tip.

Bij voorbaat hartelijk dank.
 
Een global in een function is af te raden.
PHP:
function stemlijst_var($sleutel, $bool = false)
{
  global $conn; // <==
  // .....

De $conn kan je beter zo meegeven aan de functie
Overal waar je in je project stemlijst_var(...) aanroept zal dit dan wel aangepast moeten worden.
PHP:
function stemlijst_var($conn, $sleutel, $bool = false)
{
  // .....

Aanvulling 1. In de while loop maak je variabele $waarde, dan is het denk ik
PHP:
while ($waarde = $result->fetch_assoc())
{
    echo $waarde['waarde']."<br>";
}

Aanvulling 2.
PHP:
// als $sleutel in de sql query een getal is
$sql = "SELECT waarde FROM cpl_stemlijst_vars WHERE sleutel=" . $sleutel;

// als $sleutel in de sql query een tekst is
$sql = "SELECT waarde FROM cpl_stemlijst_vars WHERE sleutel='" . $sleutel . "'";
 
Laatst bewerkt:
Bron, hartelijk dank voor het mee denken

Helaas waren deze aanpassingen niet de oplossing voor het probleem dat de functie denkt te maken te hebben met een colom in plaats van een cel uit een rij.
Melding: Unknown column 'totaal_nummers' in 'where clause'.

De input voor de functie zal trouwens aldoor text zijn maar de uitkomst kan zowel text als getal zijn.

Ik heb de functie als losse qwery getest en de "sleutel" er in opgenomen met als gevolg dat ik de juiste uitkomst terug kreeg.
Het lijkt dus te werken maar helaas niet zodra het een functie is die aangestuurd wordt.

Met vriendelijke groet.
 
Laatst bewerkt:
Echo eens $sql. Wat zie je dan?
 
De input voor de functie zal trouwens aldoor text zijn maar de uitkomst kan zowel text als getal zijn.
Het verschil zal je goed moeten aangeven in de sql query EN het moet overeenkomen met de waarde in de tabel (tekst of getal)
PHP:
$sleutel='appel'  // tekst
$sleutel='247'    // tekst
$sleutel='247.5'  // tekst

$sleutel=appel    // <= foutmelding
$sleutel=247      // getal
$sleutel=247.5    // getal
 
Doe dat eens NA je hem aanmaakt.
 
resultaat geboekt.

Na veelvuldig jullie hulp te hebben gelezen en getest is het gelukt om mijn functie werkend te maken, waarvoor mijn grote dank aan jullie.

Ik maakte achteraf een ernstige fout bij het aanroepen van de functie om het resultaat op het scherm te kunnen krijgen... :confused: .

Ne even een korte pauze en dan hup.... met de volgende verder..
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan