Mensen,

Ik heb de afgelopen tijd heel veel vragen gesteld maar ik kom tot de ontdekking het niet goed te begrijpen. Daarom back to basic. Als mensen mij willen helpen zou ik het leuk vinden anders houd het op.

Ik begin wel met een database.

Ik heb een connectie gemaakt. Daar heb ik mijn eerste vraag dan ook over:

Ik zal de code later hieronder plaatsen. De vraag is waarom krijg ik geen echo als de connectie mislukt en wel als deze lukt?


<?php
$servername = "host";
$username = "username";
$password = "password";

// Create connection
$conn = new mysqli("host","username","password","naam");
// Check connection
if (!$conn) {
    echo"connectie mislukt";
}else{
echo "Connected successfully";
}
?>

 

@Frank, je hebt gelijk. Dit is wel opmerkelijk, want mysqli_connect() is een alias van mysqli::__construct(). Je zou verwachten dat de return-values hetzelfde zijn maar inderdaad, bij het mislukken van de verbinding retourneert mysqli_connect() false en bij het aanmaken van een mysqli object resulteert dat in een object.

Dit invalideert echter niet mijn eerder gemaakte punten:
- vermijd het gebruik van aliassen, deze worden mogelijk op den duur opgeschoond
- voor het vaststellen van het slagen / mislukken van het opzetten van een verbinding is een aparte functie/methode (connect_error()); voor een expliciete controle zou je het resultaat hiervan kunnen vergelijken met NULL
- MySQLi werkt met objecten, daartoe lijkt de object georiënteerde aanpak de meest logische keuze
Ik ga wel met je mee enkel vind ik wel dat het voor een beginner/hobbyist die (nog) geen kennis van OOP heeft makkelijker is om de procedural functies te gebruiken. Vanuit de ogen van een profesional is de OOP methode beter maar een "eigen" set classes die met verschillende database drivers kunnen werken is dan nog beter.

Mensen daar ben ik weer. Ik heb een simpel formuliertje gemaakt 2 veldjes om te beginnen. Wat vinden jullie hiervan ben ik op de goede weg of zijn er no go's die ik moet vermijden? Bijvoorbeeld het controleren van velden met required?

php:



<?php

$con = mysqli_connect("gegevens database");

if(!$con)
{
  echo "geen connectie met server";
}

if (!mysqli_select_db($con, 'databasenaam'))
{
  echo "Database niet geselecteerd";
}

$username = mysqli_real_escape_string($con, $_POST['username']); 
$email = mysqli_real_escape_string($con, $_POST['email']);


$sql = "INSERT INTO gebruikers (username,email) VALUES ('$username', '$email')";

if (!mysqli_query($con,$sql))
{
  echo "Niet geplaatst";
}
else {
  echo "geplaatst";
}

?>



HTML:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>registreren</title>
  </head>
  <body>
    <form  action="insert.php" method="post">
      <input type="text" name="username" required>
      <input type="email" name="email" required>
      <input type="submit" name="insert" value="Opslaan">
    </form>
  </body>
</html>


Ik zou de validatie op de ingevulde velden ook in je PHP-code verwerken. Iedereen kan deze client-side controle eenvoudig met 'Element inspecteren' of een oude browser omzeilen. Je zou zelfs ook JavaScript kunnen gebruiken.

Ikzelf ben meer voorstander om alles in één bestand te plaatsen. Maar het is meer wat jij het lekkerste vindt werken. Uiteindelijk kan je het geheel steeds meer aanpassen na mate van je geleerde kennis. Ikzelf ontwerp mijn grote webapplicaties inmiddels uitsluitend in OOP en een MVC-model. Maar dat is niet zo interessant voor beginners. ;-)
Dank voor je tip. de controle van velden daar wil ik het dan als eerste eens over hebben. Wat vind jij een verstandige manier? is dat met if(empty($name) of kan je het beter nog anders doen? Het nadeel van het op die manier inrichten is dat ik op een andere pagina (namelijk insert.php) terechtkom daar moet ik nog even wat op verzinnen. :)
empty() is niet een intelligente functie voor controle op validatie (vul maar eens een 0 in).
Ikzelf gebruik dit:


<?php
if (trim($var)=='') {
	// leeg
}
?>
Dankjewel.

Ik heb denk ik een vrij domme vraag maar goed ik kom er zelf niet uit. Hoe kan je de inhoud van radiobuttons en checkboxes opslaan in een DB? van een chackbox kan je er natuurlijk meerdere hebben.
Bij meerdere checkboxes zet je een beginnende en eindigende blokhaak achter de name in name

<input type="checkbox" name="product[]" value="Pizza">Pizza<br>
<input type="checkbox" name="product[]" value="Spaghetti">Spaghetti

Vervolgens heb je na het versturen van het formulier een array in $_POST['product'] waarin alle gekozen waardes staan.
Volgend vraagje:

Ik controleer nu de inhoud van de velden via PHP (ja ik neem van jullie aan wat jullie zeggen :))

Maar nu krijg ik een fout namelijk dat wanneer ik het formulier de eerste keer inlaad krijg ik direct te zien geen emailadres ingevuld en na leeg opslaan krijg ik geen melding dat de velden niet zijn ingevuld maar de melding Undefined index: logisch want ik vul expres niets in maar dan zou ik een mijn gemaakte echo terug moeten krijgen.



<?php

include 'include.php';
$username = '';
$email = '';
function validate($username, $email)
{
  $error = '';

  if ($username == '')
  $error = 'u heeft geen gebruikersnaam opgegeven';

  if (!filter_var($email, FILTER_VALIDATE_EMAIL))
  $error = 'u heeft geen geldig emailadres opgegeven';

  return $error;
}

$username = '';
$email = '';

if ($_SERVER['REQUEST_METHOD'] =='POST')
{
  $username = $_POST[''];
  $email = $_POST[''];

}


$error = validate($username, $email);
if($error != '')
  echo $error;
  else {
    $username = mysqli_real_escape_string($con, $_POST['username']);
    $email = mysqli_real_escape_string($con, $_POST['email']);



    $sql = "INSERT INTO gebruikers (username,email) VALUES ('$username', '$email')";

    if (!mysqli_query($con,$sql))
    {
      echo "Niet geplaatst";
    }
    else {
      echo "geplaatst";
    }

  }

?>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>registreren</title>
  </head>
  <body>
    <form action="" method="post">
      <input type="text" name="username"> gebruikersnaam<br>
      <input type="email" name="email" >
      <input type="submit" name="insert" value="Opslaan">
    </form>
  </body>


Als je een webpagina opent, wordt de HTTP-methode GET gebruikt. Bij het verzenden van het formulier is dat POST (als je <form method="post"> gebruikt) en staan de postdata in $_POST. Controles van formulieren verpak je daarom bijvoorbeeld in:


<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // ···
}
?>


Let er verder op dat je functies nu side effects hebben: ze doen twee dingen en dat is nooit goed. Hier voert de functie bijvoorbeeld niet alleen een controle uit, maar produceert de functie altijd een string, waardoor je er vervolgens elders nog stringoperaties op los moet laten om te achterhalen of het resultaat nu goed of fout is:


<?php
function validate($username, $email)
{
  $error = '';

  if ($username == '')
  $error = 'u heeft geen gebruikersnaam opgegeven';

  if (!filter_var($email, FILTER_VALIDATE_EMAIL))
  $error = 'u heeft geen geldig emailadres opgegeven';

  return $error;
}
?>


Het is beter (of gewoon makkelijker) als je direct aan het resultaat kunt zien of de uitkomst goed of slecht is, bijvoorbeeld:

<?php
/**
* @param string $username
* @param string $email
*
* @return bool
* Returns true on success or false on failure.
*/
function validate($username, $email)
{
if (empty($username)) {
return false;
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}

return true;
}
?>
[/code]

Reageren