login  Naam:   Wachtwoord: 
Registreer je!
 Forum

if els toevoegen (Opgelost)

Offline Frank56 - 12/07/2014 09:01
Avatar van Frank56Nieuw lid Ik voeg $nummer2 toe als volgende vraag, maar er wordt bij $nummer2 niets gepost.
Dit gebeurt bij de andere vragen wel.

Maak ik nu een spaghetti-code, waardoor het niet werkt?

Hoe kan ik $nummer en $nummer2 het beste rangschikken?

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <meta http-equiv="content-type" content="text/html; charset=utf8_unicode_ci" />
  6. <title></title>
  7.  
  8. <link rel= "stylesheet" href="menu_style.css" type="text/css" />
  9. <link href="opmaak.css" rel="stylesheet" type="text/css"/>
  10.  
  11. </head>
  12.  
  13. </head>
  14.  
  15.  
  16.  
  17. <?php
  18.  
  19. include '../navigatie/nav.inc';
  20.  
  21. include ('db_connect.inc2.php' );
  22.  
  23. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  24. // verwerk formulier
  25. $nummer = $_POST['nummer'];
  26.  
  27. if ( $nummer == '100' || $nummer == 'woord1' || $nummer == 'woord2' ) {
  28. // juist antwoord
  29. $nummer_db = '1';
  30. } else {
  31. // verkeerd antwoord
  32. $nummer_db = '0';
  33. }
  34.  
  35.  
  36. $nummer2 = $_POST['nummer2'];
  37.  
  38. if ( $nummer2 == '100' || $nummer2 == 'woord1' || $nummer2 == 'woord2' ) {
  39. // juist antwoord
  40. $nummer2_db = '1';
  41. } else {
  42. // verkeerd antwoord
  43. $nummer2_db = '0';
  44. }
  45.  
  46. }
  47.  
  48.  
  49. // schrijf gegevens weg naar database
  50. $sql = "INSERT INTO Persons (FirstName, LastName, nummer, Age) VALUES (
  51. '".mysqli_real_escape_string($con, $_POST['firstname'])."',
  52. '".mysqli_real_escape_string($con, $_POST['lastname'])."',
  53. '".mysqli_real_escape_string($con, $nummer_db)."',
  54. '".mysqli_real_escape_string($con, $nummer2_db)."',
  55. '".mysqli_real_escape_string($con, $_POST['age'])."'
  56. )";
  57. if (!mysqli_query($con, $sql)) {
  58. die('Error: ' . mysqli_error($con));
  59. } else {
  60. echo "1 record added";
  61. }
  62. } else {
  63. // toon formulier
  64. ?><form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="post">
  65. voornaam: <input type="text" name="firstname" /><br />
  66. achternaam: <input type="text" name="lastname" /><br />
  67. nummer: <input type="text" name="nummer" /><br />
  68. nummer2: <input type="text" name="nummer2" /><br />
  69.  
  70. leeftijd: <input type="text" name="age" /><br />
  71. <button type="submit">verzenden</button>
  72. </form><?php
  73. }
  74. mysqli_close($con);
  75. ?>

7 antwoorden

Gesponsorde links
Offline Thomas - 12/07/2014 13:50 (laatste wijziging 12/07/2014 13:58)
Avatar van Thomas Moderator Volgens mij gaat het POSTen wel goed, maar het uitvoeren van je query niet?

Een INSERT-query werkt meestal als volgt:
INSERT INTO <tabel_naam> (<kolom_1>, ..., <kolom_n>)
VALUES (<waarde_voor_kolom_1>, ..., <waarde_voor_kolom_n>)

In jouw geval komt het aantal kolommen dat je wilt wegschrijven (de VALUES - dit zijn er vijf) niet overeen met het aantal kolommen dat je hebt gedefinieerd in je INSERT-INTO-deel (dit zijn er vier).

Normaal zou je dan een MySQL-error moeten krijgen, geen idee waarom dat niet gebeurt? Je krijgt dus niet de foutmelding van regel 58 te zien als je het formulier verstuurt? Curieus.

EDIT: Je syntax klopt niet eens volgens mij, er staat (weer) een afsluitende accolade op regel 46?! Krijg je geen parse error van PHP? Hoe kun je hier geen terugkoppeling over krijgen :/.
Offline Frank56 - 12/07/2014 14:18
Avatar van Frank56 Nieuw lid Ik had de volgende code weer weggehaald, omdat ik dacht dat alles in orde was. Nu heb ik hem weer teruggezet, maar ik krijg geen foutmelding.

  1. <?php
  2. ini_set('display_errors', 'stdout');
  3. ?>



Ik de values aangepast en de accolade in regel 46 verwijderd. Alle kolommen werken, behalve nummer2.

  1. <?php
  2. ini_set('display_errors', 'stdout');
  3. ?>
  4.  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  6. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  7. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  8. <head>
  9. <meta http-equiv="content-type" content="text/html; charset=utf8_unicode_ci" />
  10. <title></title>
  11.  
  12. <link rel= "stylesheet" href="menu_style.css" type="text/css" />
  13. <link href="opmaak.css" rel="stylesheet" type="text/css"/>
  14.  
  15. </head>
  16.  
  17. </head>
  18.  
  19.  
  20.  
  21. <?php
  22.  
  23. include '../navigatie/nav.inc';
  24.  
  25. include ('db_connect.inc2.php' );
  26.  
  27. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  28. // verwerk formulier
  29. $nummer = $_POST['nummer'];
  30.  
  31. if ( $nummer == '100' || $nummer == 'woord1' || $nummer == 'woord2' ) {
  32. // juist antwoord
  33. $nummer_db = '1';
  34. } else {
  35. // verkeerd antwoord
  36. $nummer_db = '0';
  37. }
  38.  
  39.  
  40. $nummer2 = $_POST['nummer2'];
  41.  
  42. if ( $nummer2 == '100' || $nummer2 == 'woord1' || $nummer2 == 'woord2' ) {
  43. // juist antwoord
  44. $nummer2_db = '1';
  45. } else {
  46. // verkeerd antwoord
  47. $nummer2_db = '0';
  48. }
  49.  
  50.  
  51. // schrijf gegevens weg naar database
  52. $sql = "INSERT INTO Persons (FirstName, LastName, nummer, nummer2, Age) VALUES (
  53. '".mysqli_real_escape_string($con, $_POST['firstname'])."',
  54. '".mysqli_real_escape_string($con, $_POST['lastname'])."',
  55. '".mysqli_real_escape_string($con, $nummer_db)."',
  56. '".mysqli_real_escape_string($con, $nummer2_db)."',
  57. '".mysqli_real_escape_string($con, $_POST['age'])."'
  58. )";
  59. if (!mysqli_query($con, $sql)) {
  60. die('Error: ' . mysqli_error($con));
  61. } else {
  62. echo "1 record added";
  63. }
  64. } else {
  65. // toon formulier
  66. ?><form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="post">
  67. voornaam: <input type="text" name="firstname" /><br />
  68. achternaam: <input type="text" name="lastname" /><br />
  69. nummer: <input type="text" name="nummer" /><br />
  70. nummer2: <input type="text" name="nummer2" /><br />
  71.  
  72. leeftijd: <input type="text" name="age" /><br />
  73. <button type="submit">verzenden</button>
  74. </form><?php
  75. }
  76. mysqli_close($con);
  77. ?>


Zie ik nog iets anders over het hoofd waardoor &nummer2 niet werkt?
Offline Thomas - 12/07/2014 15:42
Avatar van Thomas Moderator Uhm, heeft je database-tabel Persons een tabel-kolom genaamd nummer2? Ik zie zo gauw geen andere in het oog springende fouten.
Offline Frank56 - 12/07/2014 16:03 (laatste wijziging 12/07/2014 16:07)
Avatar van Frank56 Nieuw lid Ja, die staat erin.

Ik voeg een exportbestand van de database hierbij.

  1. -- phpMyAdmin SQL Dump
  2. -- version 3.5.7
  3. -- http://www.phpmyadmin.net
  4. --
  5. -- Machine: localhost
  6. -- Genereertijd: 12 jul 2014 om 16:00
  7. -- Serverversie: 5.3.5-MariaDB-ga-mariadb113
  8. -- PHP-versie: 5.3.28
  9.  
  10. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  11. SET time_zone = "+00:00";
  12.  
  13.  
  14. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  15. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  16. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  17. /*!40101 SET NAMES utf8 */;
  18.  
  19. --
  20. -- Databank: `bui_nl_1`
  21. --
  22.  
  23. -- --------------------------------------------------------
  24.  
  25. --
  26. -- Tabelstructuur voor tabel `Persons`
  27. --
  28.  
  29. CREATE TABLE IF NOT EXISTS `Persons` (
  30. `Firstname` text NOT NULL,
  31. `Lastname` text NOT NULL,
  32. `nummer` text NOT NULL,
  33. `nummer2` text NOT NULL,
  34. `age` text NOT NULL
  35. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  36.  
  37. --
  38. -- Gegevens worden uitgevoerd voor tabel `Persons`
  39. --
  40.  
  41. INSERT INTO `Persons` (`Firstname`, `Lastname`, `nummer`, `nummer2`, `age`) VALUES
  42. ('kees', 'tmaat', '', '', '23'),
  43. ('piet', 'jasse', '', '', '3'),
  44. ('ret', 'eew', 'nummer', '', '33'),
  45. ('kaas', 'matjes', 'nummer', '', '44'),
  46. ('hier', 'treie', 'nummer', '', '34'),
  47. ('wt', 'sd', 'nummer', '', '44'),
  48. ('ar', 'bijl', '100', '', '67'),
  49. ('frits', 'jansen', '', '', '67'),
  50. ('opa', 'wert', '', '', '23'),
  51. ('opa2', 'wert2', '1', '', '232'),
  52. ('opa22', 'wert22', '10', '', '232'),
  53. ('opa223', 'wert223', '', '', '232'),
  54. ('opa2232', '2', '45', '', '232'),
  55. ('ert', 'sss', '100', '', '76'),
  56. ('qw', 'qw', '1', '', '56'),
  57. ('44', '44', '0', '', '23'),
  58. ('yy', 'uuu', '0', '', '23'),
  59. ('y', '23', '0', '', '0'),
  60. ('qwe', 'kan', '0', '', '34'),
  61. ('34', '2', '0', '', '2'),
  62. ('qw', 'we', '0', '', '66'),
  63. ('ao', 'buiten', '1', '', '66'),
  64. ('ben', 'flink', '1', '', '66'),
  65. ('kees', 'flink', '0', '', '66'),
  66. ('patricia', 'flink', '0', '', '66'),
  67. ('bert', 'flink', '1', '', '66'),
  68. ('keesjan', 'flink', '0', '', '66'),
  69. ('www', 'www', '0', '', 'w'),
  70. ('wer', 'wer', '0', '', 'wer'),
  71. ('oi', 'oi', '0', '', 'oi'),
  72. ('sdf', 'sdf', '0', '', 'sdf'),
  73. ('vbn', 'vbn', '0', '', 'vbn'),
  74. ('vbn', 'vbn', '0', '', 'vbn'),
  75. ('asd', 'asd', '0', '', 'asd'),
  76. ('asdf', 'asdf', '0', '', 'asf'),
  77. ('zaza', 'zaza', '0', '', 'zaza'),
  78. ('dfg', 'dfg', '0', '', 'dfg'),
  79. ('dfg', 'dfg', '0', '', 'dfg'),
  80. ('poi', 'pi', '0', '', 'pi'),
  81. ('dfg', 'dfg', '0', '', 'dfg'),
  82. ('mn', 'mn', '0', '', 'mn');
  83.  
  84. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  85. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  86. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Offline Thomas - 12/07/2014 17:08 (laatste wijziging 12/07/2014 17:11)
Avatar van Thomas Moderator Heb het laatste relevante code-deel en de tabeldefinitie getest, als ik de volgende waarden invul voor respectievelijk voornaam, achternaam, nummer, nummer2, leeftijd: voornaam, achternaam, een, twee, 88 dan krijg ik netjes "1 record added" en het volgende database record:
  1. mysql> SELECT * FROM Persons;
  2. +-----------+------------+--------+---------+-----+
  3. | Firstname | Lastname | nummer | nummer2 | age |
  4. +-----------+------------+--------+---------+-----+
  5. | voornaam | achternaam | 0 | 0 | 88 |
  6. +-----------+------------+--------+---------+-----+
  7. 1 row IN SET (0.00 sec)


Ik heb dus geen idee wat je verkeerd doet.

Wel klopt er weinig van de syntax van je HTML-document (maar dat zou de werking waarschijnlijk niet moeten beïnvloeden).

Daarnaast zijn er inconsistenties in je character sets. Zoals eerder aangegeven is utf8_unicode_ci geen geldige character set voor een HTML-document voor zover ik weet.

En je database character set is latin1... Maar zoals bovenstaande output laat zien weerhoudt dit mij nog steeds niet van het correct invoegen van informatie.

EDIT: heb je de code ook bijgewerkt waar je deze uitvoert? M.a.w. heb je deze geupload of whatever? Ik weet niet waar je je code inklopt (waarschijnlijk op je eigen -lokale- computer?) en je deze uitvoert (waarschijnlijk op een webserver)? Als deze twee locaties verschillen moet je dus nog je code van A naar B verplaatsen na aanpassing eh.
Bedankt door: Frank56
Offline Frank56 - 12/07/2014 20:24 (laatste wijziging 13/07/2014 11:03)
Avatar van Frank56 Nieuw lid Ik had met form action naar het verkeerde bestand verwezen    

De code werkt perfect!

De charset moet ik inderdaad nog aanpassen naar UTF-8, maar in de database lijkt me dan utf8_unicode_ci de meest voor de hand liggende. Als ik dat beter niet kan kiezen, wat is dan het alternatief?

En de HTML ga ik aanpassen.

Hartelijk dank!
Offline Thomas - 13/07/2014 15:46 (laatste wijziging 14/07/2014 11:51)
Avatar van Thomas Moderator Niet al te lang geleden heb ik een vrij uitgebreide MySQLi tutorial geschreven. Hierin komt het correct gebruik van character sets ook aan bod.

Dit komt neer op:
- het instellen van de juiste character set van je Content-Type header. Dit kan op twee manieren:
1. via een meta tag (zorg er wel voor dat dit de EERSTE tag in je <head> is dan, nog voor je <title> dus...)
EN / OF
2. via een PHP-header

- het selecteren van de juiste character set bij het maken van een verbinding met je database, meestal is er een ..._set_charset() functie beschikbaar

- het ervoor zorgen dat je tabellen en tabel-kolommen van de juiste character set zijn

- het ervoor zorgen dat je je data op de juiste manier in je database hebt gezet, als je bijvoorbeeld een utf8-tabel hebt in MySQL, maar je had geen character set geselecteerd bij het maken van je verbinding, grote kans dat je dus data met een latin1-encoding hebt opgeslagen in een utf8-tabel

Nota bene: het instellen van een character set voor je database met een ..._set_charset() functie heeft ook implicaties voor de werking van je ..._real_escape_string() functionaliteit. Dit is dus direct van invloed op de veiligheid van / veilig communiceren met je database!

Bij voorkeur stemmen al deze character sets overeen zodat er geen vertaalfouten gemaakt kunnen worden en er ook geen overhead is, MySQL kan namelijk nog het een en ander (proberen te) repareren als je met character set A connect, terwijl je database-data in character set B is opgeslagen, deze probeert die dan terug te vertalen naar A, maar dat is dus niet altijd succesvol...

Een redelijk standaard character set die tegenwoordig wordt gebruikt is UTF-8. Deze is (vele malen) uitgebreider dan latin1 (de default die MySQL gebruikt, maar wellicht is dit inmiddels veranderd). Als ik het goed heb begrepen gebruikt latin1 zelf cp1252 West European, en deze wijkt af van iso-8859-1 al werden deze wel vaak (?) (onbewust) gecombineerd. cp1252 is ook geen standaard...

In een HTML-document wordt aan UTF-8 gerefereerd met UTF-8. In MySQL is dit echter utf8. Ook zijn er ondertussen ook al "uitbreidingen" op utf8 die langere multibyte-karakters ondersteunt:

  1. mysql> SHOW character SET WHERE Description LIKE '%UTF%';
  2. +---------+----------------+--------------------+--------+
  3. | Charset | Description | DEFAULT collation | Maxlen |
  4. +---------+----------------+--------------------+--------+
  5. | utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
  6. | utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
  7. | utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
  8. | utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
  9. +---------+----------------+--------------------+--------+
  10. 4 rows IN SET (0.06 sec)


Maar utf8 zou voor de meeste doeleinden wel genoeg zijn en is in een aantal opzichten handiger dan latin1.

EDIT: vaak is het niet eens duidelijk dat je data op de verkeerde manier wegschrijft naar je database (bijvoorbeeld omdat je een ..._set_charset() aanroep bent vergeten). De ellende begint wanneer je dit vervolgens repareert (je deze aanroep toevoegt). Dan wordt pijnlijk duidelijk dat je data met de verkeerde encodering is opgeslagen - deze wordt dan (doordat je nu via de juiste character set met je database communiceert) mogelijk ook gecorrumpeerd weergegeven. Het is dan zaak dat je voor het toevoegen van nieuwe data of het wijzigen van bestaande data je gegevens repareert want het wordt al helemaal een puinzooi als je zowel juist als verkeerd geëncodeerde data in je database hebt zitten.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.209s