Ik ben bezig met het maken van een prive website waarbij ik gebruik maak van PHP en een MySQL database. Nu heb ik er geen moeite mee om de querys via PHP MyAdmin de database te vullen.
Nu is het de bedoeling dat ik dat via een webpagina ga doen, zodat ik de data op een snelle(re) manier kan invoeren. Op termijn is het de bedoeling dat anderen ook toegang krijgen tot de pagina en hiermee dus ook de database kunnen vullen.

Ik heb hieronder een stuk tekst met daaronder de betreffende code geplaatst, met daaronder een nieuw stuk tekst en een nieuw stuk code, etc.

Ik heb hiervoor een script gebruikt via http://www.sitemasters.be/tutorials/2/1/78/MySQL/Formulier. Zie ook hieronder. Dit werkt prima.
Ik roep de php pagina db_config aan waarin mijn inloggegevens staan voor de (lokale) database.


<?php 
require_once 'db_config.php'; //verbinding maken
mysql_select_db('rum') or die (mysql_error());  //errorhandling

if(isset($_POST['verzenden'])) 
  { 
    $sVoornaam        =    addslashes($_POST['voornaam']); 
    $sAchternaam      =    addslashes($_POST['achternaam']); 
    $iLeeftijd        =    addslashes($_POST['leeftijd']); 
     
    mysql_query("INSERT INTO formulier (voornaam, achternaam, leeftijd) VALUES ('".$sVoornaam."', '".$sAchternaam."', '".$iLeeftijd."')") or die (mysql_error()); 

    echo 'Je gegevens zijn succesvol in de database geplaatst'; 
  } 
else 
  { 
?> 
<form action=" <?=$_SERVER['PHP_SELF']?>  " method="POST">
 Voornaam: <input type="text" name="voornaam"><br /> 
Achternaam: <input type="text" name="achternaam"><br /> 
Leeftijd: <input type="text" name="leeftijd"><br /> 
<input type="submit" name="verzenden" value="verzenden"> 
</form> 
<? 
  } 
?> 



Ik heb een aantal waarden aangepast en ik heb er onderstaand van gemaakt. Als ik dit uitvoer krijg ik mijn pagina met textboxen en een verzend knop weer terug, maar er worden geen records in de tabel `nose` weggeschreven.



<?php    
require_once 'db_config.php'; //verbinding maken
mysql_select_db('rum') or die (mysql_error());  //errorhandling

if(isset($_POST['verzenden'])) 
  { 
    $cRumName        =    addslashes($_POST['RumName']); 
    $iAge		     =    addslashes($_POST['Age']); 
     
    mysql_query("INSERT INTO `nose` ('RumName', 'Age') VALUES ('".$cRumName."', '".$iAge."')") or die (mysql_error());
	

	
  }
else 
{
 
?> 
<form action=" <?=$_SERVER['PHP_SELF']?>  " method="POST">
Rumnaam: <input type="text" name="RumName"><br /> 
Leeftijd: <input type="text" name="Age"><br /> 
<input type="submit" name="Verzenden" value="Verzenden"> 
</form> 
<?php 
    } 
?> 



Ik heb ook een query gemaakt in PHP die uit dezelfde tabel de waarden naam en leeftijd teruggeeft en in een tabel plaatst op de site. Dit gaat zonder problemen. (De code hiervoor staat hieronder).



<?php
require_once 'db_config.php'; //verbinding maken
mysql_select_db('rum') or die (mysql_error());  //errorhandling
$query = "SELECT `Age`,`RumName` FROM `nose` WHERE `Age` > '5' ";
//query is aangemaakt
$sql = mysql_query($query) or die ( mysql_error( ) );
//query is uitgevoerd
echo"<table>
 <tr><td>Naam</td><td>Leeftijd</td></tr>";
while($record = mysql_fetch_object($sql)){
echo"<tr><td>".$record->RumName."</td><td>".$record->Age."</td></tr>";
}
echo"</table>";

?>


Eerst dacht ik aan een rechten probleem, omdat ik wel kan lezen, maar niet kan schrijven. Ik heb daarom het gekopieerde script nog een keer in mijn PHP pagina gebruikt om te zien of ik de voornaam, achternaam en leeftijd in een andere tabel in dezelfde database wel weg kan schrijven. Dat lukte wel, dus ik denk dat het veilig is om de aanname te doen dat er voldoende rechten zijn.
Ik had eigenlijk gehoopt dat het gedeelte 'or die (mysql_error());' er voor zou zorgen dat ik een foutmelding zou zien, maar dat gebeurt ook niet. Ik heb dus nu geen idee wat ik fout doe en waar ik het nog moet zoeken.
Waarschijnlijk is het voor de toppers hier een peuleschilletje, dus als iemand me op weg zou willen helpen zou ik zeer dankbaar zijn.
Je hebt de tabelnamen tussen quotes staan waardoor het als tekst wordt gezien en niet als tabel.
Verder is addslashes() geen beveiliging voor de database.
Bedankt voor je reactie. Ik heb deze regel aangepast:

mysql_query("INSERT INTO nose (RumName, Age) VALUES ('".$cRumName."', '".$iAge."')") or die (mysql_error());

Ook dat heeft niet geholpen.
Ook de volgende variaties werkten niet:
mysql_query("INSERT INTO nose (RumName, Age) VALUES ('.$cRumName.', '.$iAge.')") or die (mysql_error());

mysql_query("INSERT INTO nose (RumName, Age) VALUES (".$cRumName.", ".$iAge.")") or die (mysql_error());
<input type="submit" name="[color=#ff0000]V[/color]erzenden" value="Verzenden">

if(isset($_POST['[color=#ff0000]v[/color]erzenden']))

Array indices zijn Case Sensitive.

Gebruik gewoon overal lowercase namen.

Ook is de volgende manier een betere om te kijken of er iets gesubmit is via POST:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // process form yolo
    // ...
}
?>
Nog even een paar puntjes aanstippen die niet de oorzaak zijn van dit probleem:

1) Je zet integer-waardes (zoals Age) tussen quotes. MySQL vindt het niet fout, maar het is altijd netter om getallen als getallen te behandelen en niet als strings. Hopelijk heb je Age gedefinieerd als een integer-type en niet als een (var)char, want dan kun je wel serieuze problemen verwachten.

2) De mysql-extensies gaan ergens in de toekomst vervallen. Als je dan niet je hele code wilt herschrijven, is het handig om nu alvast gebruik te maken van de mysqli-extensies of van PDO.
@opmerking 1 van Willem: ben ik het op zich wel mee eens, maar het is dan des te belangrijker dat je je invoer dan controleert (input filtert) om te zien of deze voldoet (de waarde ook daadwerkelijk numeriek is) voordat je deze in je query verwerkt.

Een typecast middels (int) is uit den boze, omdat er in dat geval mogelijk getracht wordt invoer die helemaal geen getal bevatte om te zetten naar een getal. Vaak levert dat dan het cijfer nul op, of een andere, maar tevens onvoorspelbare, waarde.
Waarom sla je een leeftijd op en niet de geboortedatum?
Over drie jaar is iemand in jouw database nog net zo oud als nu...
Iedereen bedankt voor de input. Voor de volledigheid zal ik wat meer achtergrond info over dit project geven.

Een paar keer per jaar komen we met vrienden bij elkaar om een rum en whiskey proeverij te houden. Iedereen neemt 1 of meerdere flessen mee en laat de overige deelnemers er van proeven.
Omdat we op de avond zelf alleen aan het genieten zijn en geen notities maken rees het plan om hiervoor een website op te zetten, zodat je kon kijken welke rum of whiskey de revue zijn gepasseerd en wat de verschillende smaken en stadia (geur, pallet en afdronk) zijn. Op die manier kun je ook gaan vergelijken op soorgelijke whiskeys of rums.
Dat is ook direct de reden dat ik de leeftijd opsla, omdat een rum of whiskey gebotteld wordt en op dat moment de leeftijd wordt meegegeven. Ook al bewaar je de fles daarna 100 jaar, de leeftijd is de leeftijd wanneer er gebotteld is.

Mochten er nog vragen zijn over dit project hoor ik het graag.
En ondertussen even wat tijd gemaakt om te bekijken waar mijn fouten zaten. En omdat ik nog redelijk in de beginfase van mijn project zit, ga ik me wat meer richten op de mysqli-extensies.
En de fouten waren inderdaad de "" en de hoofdlettergevoeligheid.

Iedereen bedankt voor de tips. Ik kan er weer verder mee en het is me inmiddels gelukt om een paar velden in MySQL te inserten via de php pagina.
"maar het is altijd netter om getallen als getallen te behandelen en niet als strings"

Quotes geven in SQL alleen aan waar de data begint en eindigt, het heeft niets te maken met datatypen, dat komt pas wanneerde waarde wordt aangeboden aan de uiteindelijke kolom endie zal de *string* interpreteren om te zien of de inhoud past in het kolomformaat. Omdat quotes alleen de waarden afbakenen is het altijd beter om ze wel te gebruiken, dan om de queryparser te laten gokken over wat je bedoelt.
Als je waarden direct in een query plakt dan is het sowieso altijd verplicht om ze te quoten, want anders zet je je script open voor SQL injectie.
> Quotes geven in SQL alleen aan waar de data begint en eindigt,

Dat is niet waar. Als je naar de BNF van SQL kijkt, zie je dat quotes alleen worden gebruikt voor string literals.

> het heeft niets te maken met datatypen, dat komt pas wanneer de waarde wordt
> aangeboden aan de uiteindelijke kolom en die zal de *string* interpreteren om
> te zien of de inhoud past in het kolomformaat. Omdat quotes alleen de waarden
> afbakenen is het altijd beter om ze wel te gebruiken, dan om de queryparser
> te laten gokken over wat je bedoelt.

Leuke theorie, maar hij slaat nergens op. ;-) De query parser voert een lexicale analyse uit op de query en zal dus een integer/decimal/etc zien als je geen quotes gebruikt, en een string als je wel quotes om de waarde zet. Dat wordt vervolgens vertaald in tokens die aan de SQL engine worden doorgegeven.

Als je quotes om een integer zet, zal de SQL engine dus een string aangeleverd krijgen in plaats van een integer. Vervolgens ziet de engine in de datadefinitie dat het een integerveld betreft, en zal hij de string naar een integer moeten typecasten. Overigens is dit qua performance verwaarloosbaar. Wat echter niet verwaarloosbaar is, is het gedrag van MySQL als je gequote integers gebruikt.

Wanneer je een insert doet op een enum-veld met numerieke waardes, moet je bijvoorbeeld goed opletten of je wel of geen quotes om je integer zet. Zonder quotes zal de waarde gezien worden als index van de enum, en met quotes wordt eerst gekeken of de enum een string bevat met die waarde. Zo niet, dan wordt het te inserten getal alsnog als index geïnterpreteerd. (Nu kun je je afvragen of het uberhaupt verstandig is je database op die manier in te richten, maar het gaat mij even om het voorbeeld dat je niet zomaar overal quotes omheen kunt zetten.)

Een ander leuk probleem dat je kunt tegenkomen is als je integerwaardes gebruikt die groter zijn dan de hardware van je systeem aankan. Die worden namelijk eerst gecast naar floating pointwaardes en pas daarna vergeleken. Het is echter mogelijk dat een integer op een andere manier wordt gecast dan een string (dat kan worden beïnvloed door bijvoorbeeld je hardware-architectuur of de versie/instellingen van de compiler) en omdat floats niet exact zijn, kan het dus voorkomen dat 'integer' <> integer.

De eerlijkheid gebiedt me te zeggen dat ik dit niet in de praktijk heb kunnen reproduceren, maar dit is wel zo'n probleem waar je rustig maanden naar kunt zoeken als je er last van hebt.

Iets wat je vaker in de praktijk zult tegenkomen, is het gebruik van een decimale komma in plaats van een decimale punt, omdat we dat nu eenmaal gewend zijn in Nederland. Stel dat je een waarde als 3,14 wilt inserten in een decimal/float-veld. Als je er quotes omheen zet, zal die waarde niet worden geconverteerd naar 3.14, maar naar 3.0. Zonder quotes krijg je een SQL-error en is het meteen duidelijk dat je input niet klopt. Dat heeft toch wel mijn voorkeur boven het inserten van verminkte data in een tabel.

> Als je waarden direct in een query plakt dan is het sowieso altijd verplicht
> om ze te quoten, want anders zet je je script open voor SQL injectie.

Ook als je waardes quote blijft je script openstaan voor SQL-injectie. Je kan immers ook quotes injecteren. ;-) De enige manier om je script te beveiligen is door alle input te sanitizen. En als het even kan prepared statements gebruiken, al moet ik zeggen dat ik dat in PHP nogal bewerkelijk vind...

Reageren