PDA

Bekijk Volledige Versie : Wat is hier nou fout aan?



slommy
15/03/05, 00:22
Hallo

ik heb een scriptje gemaakt maar hij wil alleen nog niet werken, ik heb er al een paar fouten uitgehaald maar nu zit ik echt vast.

het script zorgt ervoor dat je wat in de database kan zetten.

dit is de fout die hij aangeeft als ik op toevoegen druk:
Mysql zei: Column count doesn't match value count at row 1

dit betekent het : volgens mysql probeer je meer waarden in je database te stoppen dan je kolommen opgeeft, of andersom.

maar ik heb zitten kijken maar ik kom er toch echt niet uit mischien jullie wel dit is het scriptje:

<?
include "verbinden.php";

if ($_SERVER['REQUEST_METHOD']=='POST')
{
$query = "INSERT INTO users (naam, gebruikersnaam, email, wachtwoord)
VALUES (
'".$_POST['naam']."'
'".$_POST['gebruikersnaam']."'
'".$_POST['email']."'
'".$_POST['wachtwoord']."'
)";

$result = mysql_query($query);
if ($result === false)
{
echo 'Fout in query '.$query.'<br />Mysql zei: '.mysql_error();
}
else
{
// de rest van het script
}
}

else
{
?>
<FORM METHOD="post" ACTION="voegtoe.php?actie=toevoegen">
<table>
<tr>
<td><font size=2 face="Arial">Naam:</font></td>
<td> <input name=naam id="naam" value="" size=20 maxLength=50 ></td></tr>
<tr>
<td><font size=2 face="Arial">Gebruikersnaam:</font></td>
<td> <input name=gebruikersnaam id="gebruikersnaam" value="" size=20 maxLength=50 ></td></tr>
<tr>
<td><font size="2" face="Arial">E-mail:</font></td>
<td> <input name=email id="email" value="" size=20 maxLength=50 ></td></tr>
<tr>
<td><font size=2 face="Arial">Wachtwoord:</font></td>
<td> <input name=wachtwoord type="password" id="wachtwoord" value="" size=20 maxLength=50 ></td></tr>
</table>
<input type=submit value='Toevoegen'>
</form>
<?
}
?>
</body>
</html>

MikeN
15/03/05, 00:25
Bij:
'".$_POST['naam']."'
'".$_POST['gebruikersnaam']."'
'".$_POST['email']."'
'".$_POST['wachtwoord']."'
missen de komma's ;)

Verder zou ik je script even checken op SQL injection, daarover is genoeg op google te vinden.

slommy
15/03/05, 00:28
bedoel je soms deze komma`s

'".$_POST['naam']."',
'".$_POST['gebruikersnaam']."',
'".$_POST['email']."',
'".$_POST['wachtwoord']."',

dit heb ik juist verwijdert omdat hij dan ook met een fout kwam.

kilian
15/03/05, 00:29
Origineel geplaatst door MikeN
Bij:
'".$_POST['naam']."'
'".$_POST['gebruikersnaam']."'
'".$_POST['email']."'
'".$_POST['wachtwoord']."'
missen de komma's ;)

Verder zou ik je script even checken op SQL injection, daarover is genoeg op google te vinden.

Dat is toch niet van toepassing op MySQL?

_arno_
15/03/05, 11:31
Lijkt mij ook met comma's
echo je query eens anders, dan kun je zien wat er mogelijk mis is.

kilian
15/03/05, 11:40
had laatst een functie op php.net gevonden. Tegenwoordig gebruik ik deze voor het ontwikkelen. Het print simpel je query en foutmeldingen als er wat fout is.



function myquery ($query) {
$result = mysql_query($query);
if (mysql_errno())
echo "MySQL error ".mysql_errno().": ".mysql_error()."\n<br>When executing:<br>\n".$query."\n<br>";
return $result;
}

M2k
15/03/05, 12:50
Origineel geplaatst door slommy
bedoel je soms deze komma`s

'".$_POST['naam']."',
'".$_POST['gebruikersnaam']."',
'".$_POST['email']."',
'".$_POST['wachtwoord']."',

dit heb ik juist verwijdert omdat hij dan ook met een fout kwam.

Zo dan denk ik:

VALUES ("
'".$_POST['naam']."',
'".$_POST['gebruikersnaam']."',
'".$_POST['email']."',
'".$_POST['wachtwoord']."'
)";

MaffeMuis
15/03/05, 12:56
Origineel geplaatst door slommy
bedoel je soms deze komma`s

'".$_POST['wachtwoord']."',

dit heb ik juist verwijdert omdat hij dan ook met een fout kwam.

Die laatste komma is te veel

Mikey
15/03/05, 13:15
<?
include "verbinden.php";

if(isset($_POST[Toevoegen])){

mysql_query("INSERT INTO users SET naam = '$_POST['naam']', gebruikersnaam = '$_POST['gebruikersnaam']', email = '$_POST['email']', wachtwoord= '$_POST['wachtwoord']'")or die(mysql_error());
$melding = "OK";

if ($melding == 'OK') {
unset($melding);
// de rest van het script
}

}
?>
<FORM method="post" action="">
<table>
<tr>
<td><font size=2 face="Arial">Naam:</font></td>
<td> <input name=naam id="naam" value="" size=20 maxLength=50 ></td></tr>
<tr>
<td><font size=2 face="Arial">Gebruikersnaam:</font></td>
<td> <input name=gebruikersnaam id="gebruikersnaam" value="" size=20 maxLength=50 ></td></tr>
<tr>
<td><font size="2" face="Arial">E-mail:</font></td>
<td> <input name=email id="email" value="" size=20 maxLength=50 ></td></tr>
<tr>
<td><font size=2 face="Arial">Wachtwoord:</font></td>
<td> <input name=wachtwoord type="password" id="wachtwoord" value="" size=20 maxLength=50 ></td></tr>
</table>
<input name="Toevoegen" type="submit" id="Toevoegen" value="Toevoegen">
</form>
</body>
</html>

Zoiets zou ik ervan maken.

V. Kleijnendorst
15/03/05, 13:33
<?php

$melding = "OK";

if ($melding == 'OK') {
unset($melding);
// de rest van het script
}

?>

Waar slaat dit op?
De query is fout; kijk naar de quotes en of het een UPDATE of INSERT query is.


isset($_POST[Toevoegen])

Quotes vergeten; -> error_reporting(E_ALL);



Dat is toch niet van toepassing op MySQL?

mysql-injection niet van toepassing op mySQL?! ik hoop dat je geen applicaties bouwt die voor de buitenwereld open staan?

M2k
15/03/05, 13:45
Origineel geplaatst door Mikey
[B]
<?

mysql_query("INSERT INTO users
SET naam = '$_POST['naam']',
gebruikersnaam = '$_POST['gebruikersnaam']',
email = '$_POST['email']',
wachtwoord= '$_POST['wachtwoord']'")
or die(mysql_error());



En daar klopt natuurlijk ook niets van...

'$variable' werkt sowiezo niet echt en om er dan ook nog een paar '' er bij in te zetten werkt al helemaal niet. ('$_POST[' naam ']')

Mikey
15/03/05, 14:14
Zucht, jullie weten het allemaal zo goed, enigste die daadwerkelijk gelijk had met betrekken op het niet werken was m2k, maar plaatst dan een werkend stuk.

http://klanten.mijn-sleutel.info/test/


<?
include "config.php";
if(isset($_POST[Toevoegen])){
mysql_query("INSERT INTO users SET naam = '$_POST[naam]', gebruikersnaam = '$_POST[gebruikersnaam]', email = '$_POST[email]', wachtwoord= '$_POST[wachtwoord]'")or die(mysql_error());
$melding = "OK";

if ($melding == 'OK') {
unset($melding);
// de rest van het script
}

}

$resultaat=mysql_query("SELECT * FROM users")or die(mysql_error());
?>
<FORM method="post" action="">
<table>
<tr>
<td><font size=2 face="Arial">Naam:</font></td>
<td> <input name=naam id="naam" value="" size=20 maxLength=50 ></td></tr>
<tr>
<td><font size=2 face="Arial">Gebruikersnaam:</font></td>
<td> <input name=gebruikersnaam id="gebruikersnaam" value="" size=20 maxLength=50 ></td></tr>
<tr>
<td><font size="2" face="Arial">E-mail:</font></td>
<td> <input name=email id="email" value="" size=20 maxLength=50 ></td></tr>
<tr>
<td><font size=2 face="Arial">Wachtwoord:</font></td>
<td> <input name=wachtwoord type="password" id="wachtwoord" value="" size=20 maxLength=50 ></td></tr>
</table>
<input name="Toevoegen" type="submit" id="Toevoegen" value="Toevoegen">
</form>
</body>
</html>

<?php
while ($record = mysql_fetch_array($resultaat)) {
echo "$record[Id] $record[naam] $record[gebruikersnaam] $record[wachtwoord] $record[email]<br>";
}

?>

Tevens is het vrij onzin commentaar of het anders kan en moet, php kent meerdere wegen naar Rome.

V. Kleijnendorst
15/03/05, 15:18
Tevens is het vrij onzin commentaar of het anders kan en moet, php kent meerdere wegen naar Rome.

En sommige wegen zijn een stuk beter dan anderen.
Zet nu eens error_reporting op (E_ALL) en de notices vliegen je om de oren. Je escapet de geposte data niet en misschien kun je uitleggen waarom je dit doet:



<?php

$melding = "OK";

if ($melding == 'OK') {
unset($melding);
// de rest van het script
}
?>


Je zet $melding op 'OK' en vervolgens ga je kijken of $melding echt 'OK' bevat?

slommy
15/03/05, 15:40
M2k Hardstikke bedankt!

ik ben nog een beginner met PHP dus vandaar dat ik er ook niet echt uitkwam, maar erg bedankt!

SebastiaanStok
15/03/05, 17:52
Geen vars binnen '' dat is zo slecht.

mysql_query("INSERT INTO users SET naam = '".$_POST['naam']."', gebruikersnaam = ''".$_POST['gebruikersnaam']."', email = '".$_POST[email]."', wachtwoord= '".$_POST['wachtwoord']."'")or die(mysql_error());

En or die(mysql_error());

Kan ook wel iets beter, wat als je al iets hebt verwerkt wat afhankelijk is van die query.

Als je een beginner bent zal ik je aan raden is op http://www.phpfreakz.nl te kijken, daar zullen ze bijna altijd verder helpe.
Tenzij het over criminals gaad :D

slommy
15/03/05, 18:08
Ik zit ook op PHP freaks en daar heb ik de vraag ook al gesteld,
maar er waren gisteravond maar weinig op het forum daarzo.

daarom heb ik het hier ook maar gepost en gelijk reactie natuurlijk:d

Mikey
15/03/05, 18:37
Origineel geplaatst door V. Kleijnendors


En sommige wegen zijn een stuk beter dan anderen.
Zet nu eens error_reporting op (E_ALL) en de notices vliegen je om de oren. Je escapet de geposte data niet en misschien kun je uitleggen waarom je dit doet:



<?php

$melding = "OK";

if ($melding == 'OK') {
unset($melding);
// de rest van het script
}
?>


Je zet $melding op 'OK' en vervolgens ga je kijken of $melding echt 'OK' bevat?

Die melding was een vervanging van zijn False, en ik ken de notices maar al te goed. Ik heb een werkend voorbeeld gegeven en of het nu wel of niet netjes is het werkt. Maar goed, als we zo gaan beginnen, mis de controlle nog van bepaalde velden, addslashes bla bla. Kinderachtige opstelling.

Kinderen, ik zal in het vervolg nog een keer wat posten :X

kilian
15/03/05, 18:50
Origineel geplaatst door V. Kleijnendors
[php]<?php

mysql-injection niet van toepassing op mySQL?! ik hoop dat je geen applicaties bouwt die voor de buitenwereld open staan?

Mou nou, niet zo agresief zeg. Als even uitlegt wat het dan wel precies is dan is het geen loze opmerking, mensen (ik) kunnen het fouten maken.

Ik dacht dat injection het uitvoeren van meerdere query's is via een, van buitenaf, beinvloedde variabele. Aangezien dat je via mysql_query maar een query kan uitvoeren hoef je daar niet bang voor te zijn.

Wordt er met injection bedoeld dat er in dit geval geen variabele worden gecheckt?

SebastiaanStok
15/03/05, 19:10
Origineel geplaatst door slommy
Ik zit ook op PHP freaks en daar heb ik de vraag ook al gesteld,
maar er waren gisteravond maar weinig op het forum daarzo.

daarom heb ik het hier ook maar gepost en gelijk reactie natuurlijk:d

Ja gisteren was het inderdaat rustig, wel vreemd op zich :rolleyes:

Wat mestal is het zo druk dat je die traker niet kan bij houden.

Volgens is er het volgenden aan de hand:
Vincent is bezig met pfz2, ivo. p is ergens anders mee bezig, en de rest is plijte :D

roland
16/03/05, 23:49
ik zou wel iets van dit gebruiken:



validatie_functie() {

// codes hier

}




foreach($_POST as $key=>$value) {

$_POST[$key] = validatie_functie($value);

}

V. Kleijnendorst
17/03/05, 00:50
Origineel geplaatst door Mikey


Die melding was een vervanging van zijn False, en ik ken de notices maar al te goed. Ik heb een werkend voorbeeld gegeven en of het nu wel of niet netjes is het werkt. Maar goed, als we zo gaan beginnen, mis de controlle nog van bepaalde velden, addslashes bla bla. Kinderachtige opstelling.

Kinderen, ik zal in het vervolg nog een keer wat posten :X


Ik zie niet zo goed wat er kinderachtig aan is. Wat heb je aan een half advies of hulp die maar half werkt?

De query klopte niet, de quotes waren verkeerd en een stukje code onzinnig. Mag je daar dan geen kritiek op hebben?

J.Haagmans
17/03/05, 17:30
Origineel geplaatst door kilian
Dat is toch niet van toepassing op MySQL?
Als ik jou was, zou ik me maar eens gauw gaan verdiepen in SQL injectie :D

Als je met MySQL communiceert, communiceer je "in SQL", dat betekent dus simpelweg dat alle security leaks van SQL exploitable zijn.

Overigens is injectie alleen maar een probleem bij user input, dus het hoeft niet altijd problematisch te zijn als je geen beveiliging gebruikt.