mijn PHP is in de war!

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Hugo Maes

Hugo Maes

17/06/2011 17:10:17
Quote Anchor link
Onderstaande code geeft dit op het scherm:
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)
PHP script in nieuw venster Selecteer het PHP script
1
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());
}

?>
 
PHP hulp

PHP hulp

20/04/2024 14:49:35
 
Johnny hertogs

johnny hertogs

17/06/2011 17:52:26
Quote Anchor link
doe eens een echo van je $query en kijk wat daar uit komt
 
Dos Moonen

Dos Moonen

17/06/2011 18:47:23
Quote Anchor link
Je hebt geen enkele aanhalingstekens om de invoeg waarde staan.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
'miauw woef boe schrik'

ziet mysql als letterlijke tekst
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
miauw woef boe schrik

ziet het als vier velden
 
Hugo Maes

Hugo Maes

17/06/2011 19:13:55
Quote Anchor link
@ Johnny: UPDATE balletlists SET trick_a1 = Lazy Susan WHERE Pilot_name = 'Nils Delacourt'
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."'";
 

17/06/2011 20:10:24
Quote Anchor link
Stop, terug naar de tekentafel. Dit databasemodel is verkeerd, leer 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'.
 
Jaron T

Jaron T

17/06/2011 20:22:33
Quote Anchor link
php is niet in de war, jij bent in de war!
 
Hugo Maes

Hugo Maes

17/06/2011 20:38:12
Quote Anchor link
@Karl Karl: dit project is heel specifiek en vergt later geen input van willekeurige gebruikers. De enige gebruiker is een administrator die een trickspartywedstijd administratief afhandelt. Hiertoe dienen alle gegevens in een database te zitten, dat is evident. Ook berekende gegevens omdat die later dienen om een rangschikking op te maken. In principe is dit een eenvoudig project dat enkel ingewikkeld is omdat er zoveel verschillende parameters zijn die in de loop van de wedstrijd kunnen/zullen wijzigen.
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.
 

17/06/2011 20:46:08
Quote Anchor link
Uit jou verhaal haal ik dat je niet wilt normaliseren omdat er weinig gebruikers zijn. Ik zie niet in waarom dat een reden is om het niet te doen. Normaliseren doe je om te zorgen dat je een normaal, goed werkend, goed bruikbare database krijgt. Niet om te zorgen dat er iets is met gebruikers.
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.
Gewijzigd op 17/06/2011 21:04:35 door
 
Hugo Maes

Hugo Maes

17/06/2011 22:14:02
Quote Anchor link
inderdaad, het was 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 :-)
 
Johnny hertogs

johnny hertogs

18/06/2011 10:36:54
Quote Anchor link
Dit is de juiste query

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
 
Hugo Maes

Hugo Maes

18/06/2011 12:08:57
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?PHP
$pilotname
= "'".$pilotname."'";
?>


En nu schrijft de query wél alles naar de database zoals het hoort in deze loop
Van harte bedankt!
 

18/06/2011 12:33:17
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?PHP
$pilotname
= "'".$pilotname."'";
?>


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.
 
Hugo Maes

Hugo Maes

18/06/2011 12:46:38
Quote Anchor link
quote: "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!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.