mijn PHP is in de war!
column= trick_a1 invoeg= Turtle (Backflip)
Could not connect: FUNCTION tweelijners.Turtle does not exist
info: "tweelijners" is de naam van de database.
voor een of andere reden zoekt mysql naar de invoer als kolomnaam, terwijl het net andersom is toch?
De array $tricksinvoegen bevat alle correcte kolomnamen
Via $_POST["trick"] kan ik effectief alle 18 tricknamen ophalen die ik in een andere pagina invoer.
Welke fout heb ik gemaakt?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$pilotname = $_SESSION['pilotname'];
$pilotname = mysql_real_escape_string($pilotname);
$tricksinvoegen = array("trick_a1","trick_a2","trick_a3","trick_a4","trick_a5","trick_a6","trick_a7","trick_a8","trick_a9","trick_b1","trick_b2","trick_b3","trick_b4","trick_b5","trick_b6","trick_b7","trick_b8","trick_b9");
$sel = 0;
foreach ( $_POST["trick"] as $v)
{
echo "<br/>";
// print_r($_POST['trick']);
$invoeg = $v;
$column = $tricksinvoegen[$sel];
$scherm = "column= ". $column . " invoeg= " . $invoeg . "<br/>";
echo $scherm;
$sel = $sel + 1;
$query = "UPDATE balletlists SET ".$column." = ".$invoeg." WHERE Pilot_name = '$pilotname'";
mysql_query($query,$connection)
or die('Could not connect: ' . mysql_error());
}
?>
$pilotname = $_SESSION['pilotname'];
$pilotname = mysql_real_escape_string($pilotname);
$tricksinvoegen = array("trick_a1","trick_a2","trick_a3","trick_a4","trick_a5","trick_a6","trick_a7","trick_a8","trick_a9","trick_b1","trick_b2","trick_b3","trick_b4","trick_b5","trick_b6","trick_b7","trick_b8","trick_b9");
$sel = 0;
foreach ( $_POST["trick"] as $v)
{
echo "<br/>";
// print_r($_POST['trick']);
$invoeg = $v;
$column = $tricksinvoegen[$sel];
$scherm = "column= ". $column . " invoeg= " . $invoeg . "<br/>";
echo $scherm;
$sel = $sel + 1;
$query = "UPDATE balletlists SET ".$column." = ".$invoeg." WHERE Pilot_name = '$pilotname'";
mysql_query($query,$connection)
or die('Could not connect: ' . mysql_error());
}
?>
doe eens een echo van je $query en kijk wat daar uit komt
ziet mysql als letterlijke tekst
ziet het als vier velden
Dat klopt dus, trick_a1 is de eerste kolom waar gegevens in moeten, Lazy Susan is die eerste waarde, en de naam is die van de piloot. Dat klopt dus allemaal
@ Dos Moonen: zonder die aanhalingsteken kreeg ik altijd foutmeldingen, vermoedelijk omdat het variabelen zijn en geen waardes op zich
Toevoeging op 17/06/2011 19:16:26:
wanneer ik diezelfde code weer uitvoer met piloot Hugo en Rolling Susan als eerste waarde dan krijg ik deze fout:
column= trick_a1 invoeg= Rolling Susan
Could not connect: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Susan WHERE Pilot_name = 'Hugo'' at line 1
Toevoeging op 17/06/2011 19:19:18:
en nog meer verwarrends: als ik piloot Hugo invoer met een eerste trick die uit 1 woord bestaat dan geeft hij dit:
column= trick_a1 invoeg= Fade
Could not connect: Unknown column 'Hugo' in 'where clause'
Toevoeging op 17/06/2011 19:23:15:
De invoeg waarde heb ik nu tussen enkele aanhalingstekens staan, daarmee is het spatie-probleem e.d. al van de baan. Nu de rest nog ;-)
foreach ( $_POST["trick"] as $v)
{
$invoeg = "'".$v."'";
normaliseren.
Controleer of een post is gedaan met if($_SERVER['REQUEST_METHOD'] == 'POST')
Zie ook bijvoorbeeld sprintf.
Bouw foutafhandeling in, zie wat mysql_query teruggeeft, gebruik geen 'or die'.
Stop, terug naar de tekentafel. Dit databasemodel is verkeerd, leer Controleer of een post is gedaan met if($_SERVER['REQUEST_METHOD'] == 'POST')
Zie ook bijvoorbeeld sprintf.
Bouw foutafhandeling in, zie wat mysql_query teruggeeft, gebruik geen 'or die'.
php is niet in de war, jij bent in de war!
Het moeilijke aan het schrijven is niet zozeer het concept op zich dan wel de benodigde syntax. Alle voorbeelden in handleidingen en fora gaan steeds over gekende waarden (vb 'naam' = "Janssen Paul"). In dit project dient veel opgevraagd te worden met gebruik van loops en dus ook veldnamen e.d. die kunnen opgebouwd worden in variabelen. Er is al een paar keer gezegd toen dit project ter sprake kwam dat het door een ervaren programmeur op een halve dag te maken valt, alleen wil er niemand aan beginnen, lol
Zelf heb ik ervaring met BASIC zoals dat vroeger op de Spectrum en Amiga computers (AMOS) gebruikt werd en een beetje Z80 machinetaal. Dat is allemaal geleden van de jaren '80 hoor. Ik doe m'n best om dit gedaan te krijgen en heb al hele stukken code herschreven aan de hand van tips hier en uit handleidingen.
Momenteel kan ik al:
- de naam van een competitie invullen in de database
- alle 47 te gebruiken tricks uitlezen uit de database
- de 47 tricks voor 18 posities als keuze voorstellen en uitkiezen én doorgeven naar een volgende .php pagina en daar inlezen.
Het is dat resultaat dat ik nu in 18 opeenvolgende velden wil inschrijven. De invoer is er (en is correct), de syntax en gebruiken zijn evenwel frustrerend moeilijk en niet zo meteen ergens netjes beschreven terug te vinden in een handleiding of forum.
Foutafhandeling doe ik momenteel door onderaan elke pagina alle variabelen uit te lijsten, zo heb ik al heel wat fouten kunnen opsporen en oplossen.
Zodra het ganse project een solide geraamte heeft kan ik alle inputs e.d. volledig gaan afschermen en voorzien in een opvang van eventuele verkeerde invoer.
Eerst dus een werkende schets maken, dan de details bijschaven. :-)
Uiteindelijk zal ik het wel draaiende krijgen (ik geef mezelf een jaar), maar simpel is het zeker niet.
Het "normaliseren" ziet er mij heel logisch uit en allicht een 'must' voor mensen die professioneel bezig zijn met databases. Voor dit project is het evenwel schieten met een tweeloop op een mug. Deze sport telt amper 20 deelnemers in Nederland en België samen. We kunnen ons geen professionele programmeur veroorloven, laat staan dat die ooit gaat begrijpen wat dit project beoogt te doen.
Kijk nou ook eens op mysql_query, het kan altijd zijn dat een query niet gelukt is (server down o.i.d.) dat moet je ook ondervangen en is dus foutafhandeling. Foutafhandeling is niet debuggen, waarin je de fouten van het script probeert weg te halen.
Edit: Verder denk ik dat je geen Z80 machinetaal hebt gedaan, maar gewoon assembler, zie ook dit. En ik ben ook bekend met assembler.
vooral het rechtstreeks in het schermgeheugen van de Spectrum schrijven was een openbaring, niet in het minst door het attributen probleem in blokjes van 8x8
Het heeft me wel een basis gegeven in logica én véél koude koffie en korte nachten :-)
UPDATE balletlists SET trick_a1 = 'Lazy Susan' WHERE Pilot_name = 'Nils Delacourt'
moet je wel nog mysql_real_escape_string() gebruiken!
Succes ermee mocht je er nog niet uit zijn
De invulwaarde had ik ondertussen al goed, de escape_string staat in lijn 3 (zie hoger)
Maar de fout, die heb jij gevonden!
De Pilot_name moet tussen de ' ' staan, die voeg ik er aan toe als volgt:
En nu schrijft de query wél alles naar de database zoals het hoort in deze loop
Van harte bedankt!
Hugo Maes op 18/06/2011 12:08:57:
Kijk Johnny, daar kan ik wat mee!
De invulwaarde had ik ondertussen al goed, de escape_string staat in lijn 3 (zie hoger)
Maar de fout, die heb jij gevonden!
De Pilot_name moet tussen de ' ' staan, die voeg ik er aan toe als volgt:
En nu schrijft de query wél alles naar de database zoals het hoort in deze loop
Van harte bedankt!
De invulwaarde had ik ondertussen al goed, de escape_string staat in lijn 3 (zie hoger)
Maar de fout, die heb jij gevonden!
De Pilot_name moet tussen de ' ' staan, die voeg ik er aan toe als volgt:
En nu schrijft de query wél alles naar de database zoals het hoort in deze loop
Van harte bedankt!
Dit is je ook al bij de eerste reactie in dit topic verteld.
Dat ging over de invoegwaarde, toch?
Nu was het de variable veldwaarde (het WHERE gedeelte) waar nog een foutje inzat
De rest bleek dus al te staan zoals het hoorde.
De Pilot_name werd bij de foutmelding en echo steeds met aanhalingstekens weergegeven, het is pas na de opmerking van Johnny hierboven dat ik dezelfde manier van werken toepas op de variabele van de WHERE dat de query werkte naar behoren.
Ere wie ere toekomt!