Ik heb het onderstaand script in gebruik waar ik een of 2 week geleden nog registatie mee heb gedaan.
Maar nu werkt het niet meer en ik weet niet waarom.
Zou de oorzaak misschien zou kunnen zijn aan het feit dat een paar dagen geleden per ongeluk mijn database waar dit script in stond had verwijderd uit Wamp, iets wat ik me eigelijk niet kan vorstellen, want ik heb de zelfde database weer terug gezet die ik in data.sql heb staan.

<?php
//session_start();
include('../includes/configdb.php');
if(isset($_POST['registreer']))
{
 //controleerd of de gebruikersnaam is ingevuld
 if($_POST['username'] == '')
 {
  $_SESSION['error']['username'] = "Gebruikersnaam is verplicht.";
 }
 //controleerd of het email adres is ingevuld
 if($_POST['email'] == '')
 {
  $_SESSION['error']['email'] = "E-mail is verplicht.";
 }
 else
 {
  //conteroleerd of de indeling van de e-mail juist is
  if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $_POST['email']))
  {
   //als het het juiste formaat controleerd of de e-mail al bestaat
  $email= $_POST['email'];
   $sql1 = "SELECT * FROM user WHERE email = '$email'";
   $result1 = mysqli_query($mysqli,$sql1) or die(mysqli_error($mysqli));
   if (mysqli_num_rows($result1) > 0)
            {
    $_SESSION['error']['email'] = "Dit e-mailadres is al gebruikt.";
   }
  }
  
  //else
  {
   //Deze fout wordt ingesteld als de e-mail-formaat niet correct is
   $_SESSION['error']['email'] = "Uw e-mailadres is niet geldig.";
  }
 }
 //controleerd of het wachtwoord is ingevuld
 if($_POST['password'] == '')
 {
  $_SESSION['error']['password'] = "Wachtwoord is verplicht.";
 }
 
 //Als de fout bestaat, gaan we naar registratieformulier
 if(isset($_SESSION['error']))
 {
  header("Location: index.php");
  exit;
 }
 else
 {
  $username = $_POST['username'];
  $email = $_POST['email'];
  $password = sha1($_POST['password']);
  $com_code = md5(uniqid(rand()));

  $sql2 = "INSERT INTO user (username, email, password, com_code) VALUES ('$username', '$email', '$password', '$com_code')";
  $result2 = mysqli_query($mysqli,$sql2) or die(mysqli_error());

  if($result2)
  {
   $to = $email;
   $subject = "Biljartclub";
   $header = "Biljartclub: Bevestiging van Biljartclub";
   $message = "Hallo $username hier is een bevestiging dat jij je hebt geregistreerd op de site van onze vereniging hier onder staat een link waar je op moet klikken om je registatie te activeren.";
$message ="http://localhost/biljartstanden/members/confirm.php?passkey=$com_code";

   $sentmail = mail($to,$subject,$message,$header);

   if($sentmail)
            {
   echo "Er is een bevestiging  met acticatie-code verzonden naar uw e-mailadres.";
   }
   else
         {
    echo "Kan geen bevestigingslink naar uw e-mailadres verzenden";
   }
  }
 }
}else
{
?>
<div id="content">
<table width="330" align="center" cellpadding="0" cellspacing="1" border="0px solid black"> 
  <tr> 
  <form action="register.php" method="POST">
    <td> 
      <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF"> 
        <tr> 
          <td colspan="3"><strong><center>Registreren</center></strong></td> 
        </tr> 
        <tr> 
          <td width="150" align="left">Gebruikersnaam</td> 
          <td width="3"><b>:</b></td> 
          <td width="150" align="left"><input name="username" type="text"></td> 
        </tr> 
        <tr> 
          <td align="left">E-mailadres</td> 
          <td><b>:</b></td> 
          <td align="left"><input name="email" type="text"></td> 
        </tr> 
        <tr> 
          <td align="left">Wachtwoord</td> 
          <td><b>:</b></td> 
          <td align="left"><input name="password" type="text"></td> 
        </tr> 
        <tr> 
          <td colspan="3" align="left"><input type="submit" name="register" value="Aanmelden"> 
        </tr> 
      </table> 
    </td> 
  </form> 
  </tr> 
</table> 
<?php
}
?>

Er zijn wat dingen mis met je formulier waaronder foutafhandeling van je database query's. Het kan dus goed zijn dat er daar iets fout gaat, alleen zie jij dit nu niet. Daarom altijd foutafhandeling inbouwen!
die() is geen foutafhandeling!
Het beste kun je geen * gebruiken in je select, maar de velden invullen die je wilt hebben. Dit is in eerste instantie sneller (ja, ook als je ze allemaal alsnog invult) en ten tweede veel overzichtelijker welke velden je tot je beschikking hebt.
Je code is verder ook wat onoverzichtelijk en een formulier in een table?? Maar dat was je vraag niet :-)


foutafhandeling

[edit]
Ik zie trouwens dat je wel controleert of results1/2 true is. Krijg je wel een e-mail? Of een error?

I.p.v. de preg_match op regel 19 kun je beter filter_var gebruiken
[/edit]
Verder zie ik een hele sloot aan mogelijkheden tot SQL-injection!!
Nou ik heb er een paar foutafhandelingen bij gezet, Maar dat helpt geen bal.
Ik krijg niks, nada, nothing.
Ik heb de form er al uit gehaald en apart gedaan zodat die word door gestuurd naar register.php.
Maar krijg niks nadat ik op aanmelden klik gaat die terug naar de index waar die link voor registreren staat.
Zet hier en daar wat dump informatie. echo voor en na elk if statement. Kijk of je uberhaubt iets terug krijgt en ga zo langzaamaan je gehele script door om op te sporen waar het mis gaat.
debuggen is de enige optie:

je zegt dat je script gewerkt heeft. Dus het script an sich was kennelijk goed (goed als in "deed zijn werk", niet als in "is de ideale manier van scripten, want zie boven")

Er is dus iets aan de omstandigheden waarin het script moet werken, verandert:
- server instellingen.
- database structuur
- database connectie gegevens
- tabel "vol" als in : id als tiny int. opgeslagen en je zit aan de 127 records
- etc

Je zult dus bij veel acties moeten nagaan of iets gelukt is.
En dan denk ik met name aan foutmeldingen van mysql.
Maar zet ook eens neer in je script als iets wel gelukt is, wat het antwoord was.


--
en commmenteer regel 46 eens uit.
Alles wat er aan meldingen op het scherm komt, wil je niet direct wissen door een redirect (neem even aan dat je output buffering aan hebt staan)
Ik schrijf het er maar ff bij.
Maar door die foutafhandelingen die ik er heb gezet, zijn de regel nummer veranderd.
Ik heb dit gedaan:


if($_POST['username'] == '')
   { 
    echo "Query mislukt. Foutmelding: " . mysqli_error();
   }
    else
   {
 
  $_SESSION['error']['username'] = "Gebruikersnaam is verplicht.";
 }
?>

En dat overal gedaan, ook bij regel 57 = nu 68, Maar daar krijg ik op regel 59 = 70 deze foutmelding:


mysqli_error() expects exactly 1 parameter, 0 given in C:\wamp\www\biljart\members\register.php on line 71

En asl ik daar dan $com of $sql2 of $result2 in zet dan geeft die: Undefined variable: con in C:\wamp\www\biljart\members\register.php on line 70

Ik snap het niet het heeft altijd goed gewerkt zolang ik het heb.



Er is dus iets aan de omstandigheden waarin het script moet werken, verandert:
- server instellingen.
- database structuur
- database connectie gegevens
- tabel "vol" als in : id als tiny int. opgeslagen en je zit aan de 127 records
- etc

geen van alle naar ik weet

regel 46 moet zijn header('Refresh: 1; url=index1.php'); exit;
Als $con undefined is, waar is je database connectie dan?


if($_POST['username'] == '')
   { 
    echo "Query mislukt. Foutmelding: " . mysqli_error();
   }

Of een post leeg is heeft niks met een query te maken. Een query kan ook fout gaan als een post wel gevuld is.

Zoals Ivoo zei, comment alle headers e.d. want deze voorkomen dat jij de errors kunt zien. Je zou dan in ieder geval een foutmelding moeten krijgen waar je iets mee kunt.
Hi Niek,

mysqli_error verwacht een parameter inderdaad: string mysqli_error ( mysqli $link ) : php.net/mysqli_error.

Je roept deze functie nu aan op het moment dat je eer post waarde mist en nog helemaal geen aanroep naar de database hebt gemaakt.

<?php
$oObj = mysqli_connect( [..] );

$sQuery = "Je query";
if( false == ( $rResult = myqli_query( $oObj, $sQuery ) ) )
{
var_dump( mysqli_error( $oObj ) );
}
?>

Je fouten van de formulier velden, zal je echt op een andere manier moeten oplossen:

<?php
$aErrors = array()
if( empty( $_POST['username'] ) )
{
$aErrors[] = 'Geen username ingevuld';
}
if( !empty( $aErrors ) )
{
foreach( $aErrors as $sError )
{
echo $sError . "<br />";
}
}
?>

o.i.d.. Succes!
Sorry!!! stom,stom.en nog eens stom, verkeerde connetie.
En die echo "Query mislukt. Foutmelding: " . mysqli_error(); bij if($_POST['username'] == '') en email zijn inderdaad nutteloos want als zij leeg zijn post die niet.
Maar wat zet ik nu bij echo "Query mislukt. Foutmelding: " . mysqli_error(); want die blijft wel zichtbaar nu, ook nu het wel werkt
Die 'query mislukt' plaats je in een else waar je je controle voor $result1/2 doet.

<?php
sql1 = "
SELECT
email
FROM
user
WHERE
email = '" . mysqli_real_escape_string($email) . "'
";
$result1 = mysqli_query($mysqli,$sql1);

if($result1) {
if (mysqli_num_rows($result1) > 0) {
$_SESSION['error']['email'] = "Dit e-mailadres is al gebruikt.";
}
} else {
echo "Query mislukt. Foutmelding: " . mysqli_error($mysqli);
}
?>

Reageren