abonnementen ibood.com bol.com Coolblue
  vrijdag 12 oktober 2018 @ 14:27:00 #1
292419 NoXia
Productiefoutje
pi_182472568
registreer om deze reclame te verbergen
PHP heb ik aardig onder de knie en wil me nu gaan oriŽnteren op databases. Ik wil data toevoegen aan een database. Helaas lijkt het ergens fout te gaan aangezien de data niet aan de kolom "test" wordt toegevoegd.

Kan iemand mij op weg helpen?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$sql 
"INSERT INTO test (ID, RNAME, IP) VALUES (:ID, :RNAME, :IP)";

$stmt $pdo->prepare($sql);

$id '1';               
$RNAME'name';                  
$IP'8.8.8.8';  

$stmt->bindParam(":ID"$id);
$stmt->bindParam(":RNAME"$RNAME);
$stmt->bindParam(":IP"$IP);

$stmt->execute();

$result $stmt->execute(array(':id'=>$id':RNAME'=>$RNAME':IP'=>$IP));
?>
pi_182473624
'test' is geen kolom maar een tabel.
Goed letten op je casing.

Ik ga er van uit dat je wel een connectie hebt:
Wat zegt je pdo error info? http://php.net/manual/en/pdostatement.errorinfo.php
Je bind je parameters 2 maal. Zie de voorbeelden op http://php.net/manual/en/pdostatement.execute.php

[ Bericht 29% gewijzigd door Darkomen op 12-10-2018 16:07:18 (Leesvoer toegevoegd) ]
pi_182473643
En is je ID geen autonummering veld?
"Een menschenhater, menschenschuwend mensch, die niet gaarne andere menschen ziet; een wonderlijk, ongezellig mensch, vijand van alle vrolijkheid.'
"My voice is nothing, my thoughts are nothing, in many respects I'm like you; nothing"
  vrijdag 12 oktober 2018 @ 16:04:47 #4
2671 Aaargh!
Gebruik op eigen risico.
pi_182473833
registreer om deze reclame te verbergen
quote:
0s.gif Op vrijdag 12 oktober 2018 15:48 schreef Ceased2Be het volgende:
En is je ID geen autonummering veld?
Ik mag hopen van niet.
It is impossible to live a pleasant life without living wisely and well and justly.
And it is impossible to live wisely and well and justly without living a pleasant life.
  vrijdag 12 oktober 2018 @ 16:15:19 #5
292419 NoXia
Productiefoutje
pi_182473965
quote:
0s.gif Op vrijdag 12 oktober 2018 15:47 schreef Darkomen het volgende:
'test' is geen kolom maar een tabel.
Goed letten op je casing.

Ik ga er van uit dat je wel een connectie hebt:
Wat zegt je pdo error info? http://php.net/manual/en/pdostatement.errorinfo.php
Je bind je parameters 2 maal. Zie de voorbeelden op http://php.net/manual/en/pdostatement.execute.php

Ja klopt, de connectie is er. Ik bedoelde inderdaad tabel, die tabel bestaat uit kolommen.

Ah, ik zie nu inderdaad dat ik ze 2x bind |:(
  vrijdag 12 oktober 2018 @ 16:16:13 #6
292419 NoXia
Productiefoutje
pi_182473982
quote:
0s.gif Op vrijdag 12 oktober 2018 15:48 schreef Ceased2Be het volgende:
En is je ID geen autonummering veld?
Jaa, dat is het wel. Niet goed? De bedoeling is namelijk dat bij elke entry het id automatisch wordt opgehoogd.
  vrijdag 12 oktober 2018 @ 21:27:27 #7
85514 ralfie
!Yvan eht nioj
pi_182479596
registreer om deze reclame te verbergen
quote:
1s.gif Op vrijdag 12 oktober 2018 16:16 schreef NoXia het volgende:

[..]

Jaa, dat is het wel. Niet goed? De bedoeling is namelijk dat bij elke entry het id automatisch wordt opgehoogd.
Als het een autonummering veld is, hoef je deze toch niet mee te geven? Dat is het hele idee van autonummering, lekker aan de database overlaten.
pi_182479749
quote:
0s.gif Op vrijdag 12 oktober 2018 16:04 schreef Aaargh! het volgende:

[..]

Ik mag hopen van niet.
Want?
"Een menschenhater, menschenschuwend mensch, die niet gaarne andere menschen ziet; een wonderlijk, ongezellig mensch, vijand van alle vrolijkheid.'
"My voice is nothing, my thoughts are nothing, in many respects I'm like you; nothing"
  vrijdag 12 oktober 2018 @ 22:47:15 #9
292419 NoXia
Productiefoutje
pi_182481476
quote:
0s.gif Op vrijdag 12 oktober 2018 21:27 schreef ralfie het volgende:

[..]

Als het een autonummering veld is, hoef je deze toch niet mee te geven? Dat is het hele idee van autonummering, lekker aan de database overlaten.
Dat klopt en is ook wel logisch maar dat had ik al geprobeerd. Heb ook geprobeerd de waarde null mee te geven, tevergeefs overigens.

Ik dacht, misschien een waarde mee geven zodat het weet waar te beginnen.
  zaterdag 13 oktober 2018 @ 11:08:02 #10
2671 Aaargh!
Gebruik op eigen risico.
pi_182488086
quote:
1s.gif Op vrijdag 12 oktober 2018 21:33 schreef Ceased2Be het volgende:

[..]

Want?
Verscheidene redenen.

• Voorspelbare ID's want oplopend, als deze ID's vervolgens in URL's gebruikt maakt dit een e.v.t. beveiligingslek erger (iemand kan een scriptje schrijven die in 1 keer je database leegtrekt). Ook zonder beveiligingsprobleem is dit vaak niet wenselijk (kijk naar b.v. dit forum die opvolgende id's gebruikt voor topic nummers, je kan zo een kopie trekken van het hele forum als je wil).
• Je creŽert een synchronisatie punt in je database. Er kan maar 1 thread tegelijk het tellertje ophogen, als er veel parallelle inserts zijn vormt dit een bottleneck. Dit wordt nog erger als je database geclusterd is.
• Je kan niet 'offline' primary keys genereren, omdat je altijd eerst moet checken of ie al bestaat (en dus synchroniseren). Dit maakt het lastig om offline data op te slaan en later de synchroniseren met de database. Het maakt het ook lastig om referenties tussen verschillende rows te maken voordat je ze in de database insert (je weet pas het id van een row nadat je de insert doet).

Beter is gewoon UUID's gebruiken.
It is impossible to live a pleasant life without living wisely and well and justly.
And it is impossible to live wisely and well and justly without living a pleasant life.
pi_182490275
quote:
0s.gif Op zaterdag 13 oktober 2018 11:08 schreef Aaargh! het volgende:

[..]

Verscheidene redenen.

• Voorspelbare ID's want oplopend, als deze ID's vervolgens in URL's gebruikt maakt dit een e.v.t. beveiligingslek erger (iemand kan een scriptje schrijven die in 1 keer je database leegtrekt). Ook zonder beveiligingsprobleem is dit vaak niet wenselijk (kijk naar b.v. dit forum die opvolgende id's gebruikt voor topic nummers, je kan zo een kopie trekken van het hele forum als je wil).
• Je creŽert een synchronisatie punt in je database. Er kan maar 1 thread tegelijk het tellertje ophogen, als er veel parallelle inserts zijn vormt dit een bottleneck. Dit wordt nog erger als je database geclusterd is.
• Je kan niet 'offline' primary keys genereren, omdat je altijd eerst moet checken of ie al bestaat (en dus synchroniseren). Dit maakt het lastig om offline data op te slaan en later de synchroniseren met de database. Het maakt het ook lastig om referenties tussen verschillende rows te maken voordat je ze in de database insert (je weet pas het id van een row nadat je de insert doet).

Beter is gewoon UUID's gebruiken.
Ik snap je punten. Echter hoef je de id niet direct als primary te gebruiken. Performance-gewijs is het beter om een int als is te gebruiken met een auto increment en deze als clustered index te zetten. Zo garandeer je iig geen fragmentatie bij inserts wat je bij non-sequential guids wel hebt. plus je houdt je CI klein. Je punt vwb parallele inserts echter niet mee eens. Tuurlijk heb je waits maar die zijn verwaarloosbaar als je het goed inricht. En zelfs bij tienduizenden inserts per minuut heb ik daar nog geen issues mee gezien.

Offline primary keys kun je dus best al bepalen. Bijv een guid voor een referentie-tabel. Echter wordt de huid niet de primary key (en niet de clustered index). Wel de snelheid van een goede ci die niet fragmenteert en de mogelijkheid om zelf guids te bepalen.
"Een menschenhater, menschenschuwend mensch, die niet gaarne andere menschen ziet; een wonderlijk, ongezellig mensch, vijand van alle vrolijkheid.'
"My voice is nothing, my thoughts are nothing, in many respects I'm like you; nothing"
  zaterdag 13 oktober 2018 @ 16:37:12 #12
85514 ralfie
!Yvan eht nioj
pi_182493523
quote:
1s.gif Op vrijdag 12 oktober 2018 22:47 schreef NoXia het volgende:

[..]

Dat klopt en is ook wel logisch maar dat had ik al geprobeerd. Heb ook geprobeerd de waarde null mee te geven, tevergeefs overigens.

Ik dacht, misschien een waarde mee geven zodat het weet waar te beginnen.
Hoe zag je code eruit zonder de identifier erbij?

quote:
0s.gif Op zaterdag 13 oktober 2018 11:08 schreef Aaargh! het volgende:

[..]

Verscheidene redenen.

• Voorspelbare ID's want oplopend, als deze ID's vervolgens in URL's gebruikt maakt dit een e.v.t. beveiligingslek erger (iemand kan een scriptje schrijven die in 1 keer je database leegtrekt). Ook zonder beveiligingsprobleem is dit vaak niet wenselijk (kijk naar b.v. dit forum die opvolgende id's gebruikt voor topic nummers, je kan zo een kopie trekken van het hele forum als je wil).
• Je creŽert een synchronisatie punt in je database. Er kan maar 1 thread tegelijk het tellertje ophogen, als er veel parallelle inserts zijn vormt dit een bottleneck. Dit wordt nog erger als je database geclusterd is.
• Je kan niet 'offline' primary keys genereren, omdat je altijd eerst moet checken of ie al bestaat (en dus synchroniseren). Dit maakt het lastig om offline data op te slaan en later de synchroniseren met de database. Het maakt het ook lastig om referenties tussen verschillende rows te maken voordat je ze in de database insert (je weet pas het id van een row nadat je de insert doet).

Beter is gewoon UUID's gebruiken.
-elke random id moet gequeried worden met human-readable input. Ik kan fok leegtrekken door eerst alle fora te querien, dan alle topics, dan alle posts. Is nauwelijks moeilijker dan wanneer geen uuids gebruikt worden
-Alle gangbare databases handelen inserts singletreaded af (hele tabel wordt gelocked). Een ID lookup en increment is verwaarloosbaar snel, en zeker minder belastend dan de extra bandbreedte die uuids met zich meebrengen. Verhaal is ingewikkelder bij distributed databases, maar daar heeft ts niet mee te maken.
-Goed punt, is een tekortkoming. Ik zou dat met stored procedures oplossen, maar is geen superelegante oplossing inderdaad.
  maandag 15 oktober 2018 @ 12:35:32 #13
292419 NoXia
Productiefoutje
pi_182527151
Bedankt allen voor jullie feedback. Ik heb de code omgegooid en de bindings weggehaald. Het werkt nu wel goed. De auto increment werkt nu ook.

1
2
3
4
5
6
7
8
9
10
11
12
<?php
    $link 
= new PDO("mysql:host=$dbhost;dbname=$dbname"$dbusername$dbpassword);
    
$link->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);

    
$statement $link->prepare("INSERT INTO test(RNAME, IP)
        VALUES(?,?)"
);
    
    
$RNAME'name';                  
    
$IP'8.8.8.8';                 

    
$statement->execute(array($RNAME,$IP));
?>
abonnementen ibood.com bol.com Coolblue
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')