Ik probeer al wekenlang uit te vinden waarom mijn mysql database niet wordt ge-update met de nieuwe en/of eerste data die ik hem aanbied. Ik denk dat ik ergens een denkfout maak.

Aan het einde van deze routine bij de query "mysql_query("INSERT INTO custumer_id..." zou ik de database moeten updaten. Dit script "POST_CREATE.PHP" maakt onderdeel uit van meerdere scripts die samen de website vormen. Dit script bedoelt als onderdeel van het kunnen inloggen op de site. Een account wordt aangemaakt, het wachtwoord wordt md5 versleuteld en deze data van de inschrijver wordt vergaard en verstuurd naar de mysql database. Deze wordt niet geacepteerd.

De scripts zijn origineel door iemand anders gemaakt, maar verder door mij ontwikkelt. Ik kan daar dus niet op terugvallen.
Ik ben echter niet dagelijks met PHP bezig alhoewel ik er wel veel van begrijp. Ik hoop op een beginnersfout.

Aan het einde van dit scrip heb ik een testblokje gemaakt om te kijken waarmee de variabelen gevuld zijn. Hieruit blijkt dat de encryptie goed gaat.

Mijn vraag is hoe kan ik er voor zorgen dat de data wel in de database wordt opgenomen, c.q. wordt ge-update?

Alvast heel erg bedankt!



Begin code:
=========================

<?php
// POST_CREATE.PHP Onderhoud klantdata en password

// De $_POST variabele is een array van variabele namen en waarden verzonden met de HTTP POST methode.
// De $_POST variabele wordt gebruikt om formulier waarden op te halen verzonden met de method="post" methode.
// Informatie verzonden met de POST methode is onzichtbaar voor anderen en heeft geen limiet met de
// hoeveelheid data die verzonden wordt.
// Het "welkom.php" bestand kan nu de $_POST variable gebruiken om de data op te halen (De formulier
// veldnamen worden automatisch de ID sleutels in de $_POST array.)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CONTROLEERT OF ER EEN 'letter' IS
if (isset($_POST['letter']))
{
$_POST['letter'] = 1;
}
else
{
$_POST['letter'] = 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// POST OVERZETTEN NAAR DE ARRAY $input
if (!empty($_POST)) // Als $_POST niet leeg is.
{
$input = array(
$_POST['def_lang'],
$_POST['def_gen'],
$_POST['name_1'],
$_POST['name_2'],
$_POST['company'],
$_POST['address1'],
$_POST['address2'],
$_POST['city'],
$_POST['country'],
$_POST['telnr'],
$_POST['email'],
$_POST['letter']);

// OPHALEN SESSIE-TAAL
$_SESSION['lang'] = $input[0];

// VELDEN INLADEN IN GEKOZEN SESSIE-TAAL in ARRAY $empty_c
// [''] = LEEG
// [''] = LEEG
// [TEXT_Erln] = Achternaam
// [TEXT_Erfn] = Voornaam
// [''] = LEEG
// [TEXT_Erad] = Adres
// [TEXT_Erzip] = Postcode
// [TEXT_Ercity] = Woonplaats
// [''] = LEEG
// [''] = LEEG
// [TEXT_Ermail] = E-mailadres
// [''] = LEEG
//
// $empty_t = TEXT_Ermain = Tekst: 'We hebben niet ontvangen:'

$empty_c = array(
'',
'',
TEXT_Erln,
TEXT_Erfn,
'',
TEXT_Erad,
TEXT_Erzip,
TEXT_Ercity,
'',
'',
TEXT_Ermail,
'');

$empty_t = TEXT_Ermain;

$mi = 0;
$li = 0;
// ALS EEN VELD BESTAAT
while (isset($input[$li]))
{
// ALS VELD LEEG IS MAAR VELDAANDUIDING BESTAAT WEL VUL DAN ARRAY $empty_l met VELDAANDUIDING
if (($input[$li] == '') AND ($empty_c[$li] != ''))
{
$empty_l[$mi] = $empty_c[$li];
$mi++;
}
$li++;
}
// !eregi IS DEPRECATED 25-03-2010

// ALS ER GEEN 'email' OF EEN ONGELDIG E-MAILADRES WERD OPGEGEVEN
if (($_POST['email'] != '') AND (!preg_match('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i', strtolower($input[10]))))
{
// LAAD BOODSCHAP 'GEEN (GELDIG) E-MAILADRES' IN
$empty_l[$mi] = TEXT_Ervmail;
$mi++;
}
//ALS 'EMAIL' NIET LEEG EN WEL GELDIG IS
elseif ($_POST['email'] != '')
{
// CONTROLEER OP REEDS BESTAANDE E-MAILADRES OF BIEDNUMMER
$query_cm = "SELECT * FROM custumer_id WHERE email = '".$_POST['email']."' AND bied_nr='0'";
$result = mysql_query($query_cm);
if ((mysql_num_rows($result) > 0) AND ((!isset($_SESSION['Costum_iD'])) OR (!isset($_SESSION['Admino_iD']))))
{
// ALS E-MAILADRES REEDS IN GEBRUIK IS
$empty_l[$mi] = TEXT_Erfmail;
}
}
}


// ALS E-MAILADRES IS GEACCEPTEERD
if (!isset($empty_l))
{
$li = 0;
while (isset($input[$li]))
{
// VERWIJDER HAKEN en QOUTES
$input[$li] = str_replace(array("<",">","'"),array('','','&rsquo;'), $input[$li]);
$li++;
}


// ALS ER EEN KLANTCODE OF ADMIN-ID BESTAAT
if ((isset($_SESSION['Costum_iD'])) OR (isset($_SESSION['Admino_iD'])))
{
if (isset($_SESSION['Costum_iD']))
{
// BESTAAT ER EEN KLANTCODE, LAADT DEZE DAN IN $edit_id
$edit_id = $_SESSION['Costum_iD'];
}
else
{
// BESTAAT ER EEN ADMIN-ID, LAADT DEZE DAN IN $edit_id
$edit_id = $_SESSION['Admino_iD'];
}



// ZET (OF UPDATE) KLANTDATA IN DATABASE
mysql_query("
UPDATE custumer_id
SET
gender= '".$input[1]."',
l_name = '".$input[2]."',
f_name = '".$input[3]."',
company = '".$input[4]."',
address_1 = '".$input[5]."',
address_2 = '".$input[6]."',
city = '".$input[7]."',
country = '".$input[8]."',
tel_nr = '".$input[9]."',
email = '".$input[10]."',
lang = '".$input[0]."',
letter= '".$_POST['letter']."'

WHERE id = '".$edit_id."'");

// $pers_mssg = "UW ACCOUNT IS BIJGWERKT!"
$pers_mssg = TEXT_updac;
}

// ALS ER NOG GEEN ACCOUNT BESTAAT
else
{
//Random namen
$Pass_w = array (
"Boek","Auteur","Schrijver","Incunabel","Letter","Parafrase","Paragraaf","Titel","Novelle","Accent",
"Citaat","Gedicht","Dichter","Manuscript","Illustratie","Biologie","Biografie","Monografie","Vondel",
"Cats","Archeologie","Bibliografie","Kaft","Boekbinding","Katern","Indonesia","Plato","Aristotelus",
"Medea","Oedipus","Odysseus","Voorplat","Preeg","Houtsnede","Calligrafie","Lithografie","Kopergravure",
"Narcissus","Achilles","Adonis","Antigone","Aphrodite","Argus","Ariadne","Artemis","Daedalus","Dionysus",
"Helios","Hermes","Hyperions","Icarus","Minotaur","Morpheus","Muze","Nimph","Orpheus","Penelope","Persephone",
"Pollux","Prometheus","Rhea","Phaedrus","Pytagoras","Ilias","Homeros","Plutarchus","Plato","Zeno","Vergilius",
"Cicero","Horatius","Ovidius","Perpetua","Euclides","Euripides","Sophocles","Epicures","Codex","Lexicon",
"Literatuur","Sonnet","Emblemata","ExLibris","Drukpers");
// "","","","","","","","","","","","","","","","","","","",
// "","","","","","","","","","","","","","","","","","","",

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MAAK E-MAIL AAN
// $Shop = Naam van de shop
// $shop[0] = Letter 'A'??
// $result2 = Bericht ID
// $shop_mail[0] = "Welkom bij Amsterdam Book Auctions"
// $shop_mail[1] = "U heeft een account aangemaakt bij Amsterdam Book Auctions. U kunt nu inloggen...
$totaal = count ($Pass_w); // Aantal (wacht)woorden
$willekeur = mt_rand(1,$totaal-1); // Random volgnummer van wachtwoord binnen de lijst
$passw_num = mt_rand(10001,99999); // Random getal van 5 cijfers
$PassW_in = $Pass_w[$willekeur].$passw_num; // Aangemaakt wachtwoord
$direct_link = TEXT_dir_link; // 'Hieronder vindt u de link naar de loginpagina...
$casesens = TEXT_case_sens; // 'Uw wachtwoord is hoofdlettergevoelig...
$einde_mail = TEXT_maileinde; // Einde mail; Welkom op de website
$ondertitel = TEXT_ondertitel; // Veilingmeester
$login_link = 'http://www.amsterdambookauctions.com/index.php?page=login';; // Link naar loginpagina website
$query_sh = "SELECT shop_name, shop_owner, email FROM shop_info"; // query voor ophalen Shop ID
$result = mysql_query($query_sh); // Shop ID

if (mysql_num_rows($result) > 0)
{
while ($shop_inf = mysql_fetch_row($result))
{
$shop = $shop_inf[0];
$query_ma = "SELECT title_".$_SESSION['lang'].", mail_".$_SESSION['lang']."
FROM email_list
WHERE mail_sub = 'welcome'";
$result2 = mysql_query($query_ma);
if (mysql_num_rows($result2) > 0)
{
while ($shop_mail = mysql_fetch_row($result2))
{
$mail_cont = $shop_mail[1]."\n"
."Uw wachtwoord is:"."\n"
.$PassW_in."\n \n"
.$direct_link."\n"
.$login_link."\n \n"
.$einde_mail." \n \n"
.$shop_inf[1]."\n"
.$ondertitel
;

// $input[10] = geadresseerde
// $shop_mail[0] = Onderwerp e-mail
// $mail_cont = Inhoud e-mail
// $shop_inf[1] = Shopowner
// $shop_inf[2] = Afzender (FROM:)
// $login_link = link naar de login pagina

// VERZEND E-MAIL
mail(strtolower($input[10]), $shop_mail[0], $mail_cont, "From: ".$shop_inf[2]);

}
}
}
}

// SCHRIJF DE KLANTDATA NAAR DATABASE - .md5($PassW_in). is de hash encryptor die de password versleuteld.
// GETEST - '".strtolower($input[10])."', = OK
// GETEST - Namen databasevelden komen overeen = OK

mysql_query("INSERT INTO custumer_id
(
gender,
l_name,
f_name,
company,
address_1,
address_2,
city,
country,
tel_nr,
email,
lang,
pass_w,
time_cr,
last_visit,
letter)

VALUES
(
'".$input[1]."',
'".$input[2]."',
'".$input[3]."',
'".$input[4]."',
'".$input[5]."',
'".$input[6]."',
'".$input[7]."',
'".$input[8]."',
'".$input[9]."',
'".$input[10]."',
'".strtolower($input[10])."',
'".md5($PassW_in)."',
'".$now."',
'".$now."',
'".$_POST['letter']."')
");

// testblokje
//print ($input[1]);
//print ($input[2]);
//print ($input[3]);
//print ($input[4]);
//print ($input[5]);
//print ($input[6]);
//print ($input[7]);
//print ($input[8]);
//print ($input[9]);
//print ($input[10]);
//print ($input[0]);
print (custumer_id);
print (" - ");
print ($input[10]);
print (" - ");
print ($PassW_in);
print (" - ");
print (md5($PassW_in));

//$pers_mssg = Uw account is aangemaakt, open uw email...;
//$pers_mssg = TEXT_sucnwac;

}
}
?>
Koffiedik kijken zonder foutafhandeling van je query.... Zorg er dus eerst voor dat je weet wat er gebeurt door de uitkomst van je query te checken en (indien nodig) de error messages van de database op te halen.

Overigens is dat niet toepassen inderdaad een typische beginnersfout.
mysql_fetch_row()

dat is niet heel handig: je ziet verderop in je script dingen als $input[10] terug komen.
Dat wordt dan dus terugzoeken wat het 11e element in de select van de query was.....

handiger is om mysql_fetch_assoc() te gebruiken.
Je kunt dan array's als $input['username'] etc gebruiken.
Dat script een heel stuk overzichtelijker, maakt ook dat als je ooit de noodzaak ziet om een extra kolom toe te voegen aan de query, je niet per se die nieuwe als laatste moet plaatsen. (of alles kapt te zien gaan als je dat niet doet.)
Aan Erwin:

Heel erg bedankt voor je reactie.

Ik zal kijken of de foutafhandeling ergens global wordt onderdrukten dit eventueel uitschakelen.
De uitkomst van de query bekijk ik nu op de database door te kijken of de record wordt toegevoegd met phpmyadmin.
Kan je eventuele error messages uitlezen met phpmyadmin? Of doel jij op eenandere methode?

Michael

[size=xsmall]Toevoeging op 14/04/2014 00:52:18:[/size]

Aan Ivo:

Ook jij erg bedankt voor je reacie!
Hele fijne tip die je me geeft. Mijn korte termijn geheugen is niet zo denderend dus ik moest inderdaad telkens het rijtje aftellen om te weten om welke variabele het ging; erg irritant...
Ik zal deze query methode uitpluizen en veranderen in het script. Weer wat geleerd.

Michael
Michael del Pino op 14/04/2014 00:47:40

Ik zal kijken of de foutafhandeling ergens global wordt onderdrukten dit eventueel uitschakelen.

Daar hoef je in dit geval niet naar te kijken, dat heeft alleen te maken met php errors, in dit geval gaat het om mysql errors.
Michael del Pino op 14/04/2014 00:47:40

De uitkomst van de query bekijk ik nu op de database door te kijken of de record wordt toegevoegd met phpmyadmin.
Kan je eventuele error messages uitlezen met phpmyadmin? Of doel jij op eenandere methode?

Vergeet phpmyadmin, daar heb je in dit geval helemaal niets aan. Wat je wil is in je script controleren wat er is gebeurd en of het wel of niet goed ging. Jij wil neem ik later toch niet na elk pagina bezoek je database moeten doorspitten om te zien of de actie van de bezoeker is gelukt? Foutafhandeling in je script dus. Lees dit bijvoorbeeld eens door: http://ictscripters.com/index.php?page=UserBlogEntry&entryID=6

<?php
// Zorg dat foutmeldingen weergegeven worden
error_reporting(E_ALL);
?>

Als je nou op de PHP website kijkt naar een functie zoals mysql_connect() dan zie je onder andere dit:

Return Values

Returns a MySQL link identifier on success or FALSE on failure.

De functie kan dus ook FALSE teruggeven als er iets mis gaat. Daar moet je wel nog iets mee doen zoals in onderstaand voorbeeld:
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');

// indien $link FALSE is
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_close($link);
?>
Aan Frank:
Bedankt voor de tip...

Michael

[size=xsmall]Toevoeging op 14/04/2014 14:03:45:[/size]

Dag Erwin,

Bedankt voor de tips en aanwijzingen. Ik heb het blog gelezen. Het is heel helder.

Ik heb de volgende routine geplaatst:


//Query is mislukt. Afhandelen

//De gebruiker een nette response geven
echo 'Er ging iets mis op deze pagina. De error is bekend en wordt zo snel mogelijk opgelost. Excuses voor het ongemak!';

//Bestandsnaam
$bestand = "log_index.txt";
//Bestand openen. Als het bestand nog niet bestaat wordt het aangemaakt.
$log_openen = fopen($bestand, 'a');
//De error
$error = date("d-m-Y G:i").' - '.mysql_error().' in query: '.$query;
//De error naar het bestand schrijven
fwrite($log_openen, $error);
//Het bestand sluiten
fclose($log_openen);

}

else

{

//Query is gelukt
//Rest van het script

echo 'Alles ging goed!';

}

Ik krijg de volgende bericht op het scherm:
... iets mis op deze pagina. De error is bekend en wordt zo snel mogelijk opgelost. Excuses voor het ongemak! Notice: Undefined variable: query in D:\www\amsterdambookauc.com\www\functions\post_create.php on line 327

regel 327 is de volgende regel uit de bovenstaande error-routine:
"$error = date("d-m-Y G:i").' - '.mysql_error().' in query: '.$query;"
De error wordt niet weggeschreven... Althans ik vindt hem niet op de server.

Moet ik misschien iets aanpassen in de routine?


ik zou nu even die foutafhandeling direct bij de query zelf doen:
<?php echo mysql_error() . ' met '. $query; ?>

Netter is het om inderdaad een logfile te gebruiken, maar als je daarbij nu fouten extra introduceert, is dat ook niet handig om dit probleem _nu_ op te lossen.
@Ivo, dat zal in dit geval dezelfde foutmelding opleveren, want...

@TS je moet wel even begrijpen wat je doet. In dat blog wordt ervanuit gegaan dat de query in de variabele $query gedefinieerd is (zie regel 4 en 7 in de code op het blog). Dat heb je niet gedaan, aangezien je direct de query als een string meegeeft aan de mysql_query functie (zie regels 141 en 241 in je code). Beide niets mis mee overigens, maar je zal dus nog wel die query over moeten zetten naar de log. Bedenk zelf eerst eens hoe dat te doen.
Omdat ik de oplossing van een errorlog zo mooi vond ben ik toch verder gaan zoeken en kwam er inderdaad achter dat ik de query nog moest overzetten. Dat is me nu gelukt.

Michael

[size=xsmall]Toevoeging op 14/04/2014 17:12:48:[/size]

Het is gelukt. Ik krijg nu de boodschap 'De error is bekend en wordt zo snel mogelijk opgelost. Excuses voor het ongemak!' en verder geen andere errorboodschappen.

Ik kan echter de logfile "log_index.txt" niet vinden.
Ik kon hem wel naar het beeldscherm printen en de boodschap daarin is als volgt:

14-04-2014 16:02 -
Duplicate entry '0' for key 'bied_nr_2' in query:
INSERT INTO custumer_id ( gender, l_name, f_name, company, address_1, address_2, city, country, tel_nr, email, lang, pass_w, time_cr, last_visit, letter) VALUES ( '1', 'achternaam', 'voornaam', 'bedrijf', 'adres', 'pc', 'stad', 'land', 'telefoon', '[email protected]', '[email protected]', '8941c3cc60abb4ee1ed4b709d5245ca5', '1397484131', '1397484131', '1')

De query vult dus 15 keys (velden) de kolom bevat echter 18 velden en is als volgt:
id int(30)
bied_nr varchar(16)
gender int(1)
l_name varchar(80)
f_name varchar(50)
company varchar(35)
address_1 varchar(100)
address_2 varchar(25)
city varchar(50)
country varchar(50)
tel_nr varchar(15)
email varchar(150)
lang char(3)
pass_w varchar(35)
time_cr int(18)
last_visit int(18)
letter int(1)
rang int(1)

Ik ga nu onderzoeken wat er mis gaat. Ik zie al dat er twee maal emailadressen in staan, fout dus...

Michael





Zo te zien heb je een default op de kolom bied_nr staan en ook een UNIQUE INDEX erop.

Reageren