PDO stukje werkt niet zoals ik wil.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

C# .NET Software Ontwikkelaar WO 3.300 - 4.800

Functieomschrijving C# .NET Software Ontwikkelaar WO 3.300 - 4.800 Software Engineer (Backend Developer) Voor de vacature als C# .NET Software Ontwikkelaar Ederveen WO ga je het volgende doen: De functie is gericht op het voorbereiden, ontwikkelen en schrijven van onze MES applicatie inclusief de inrichting van de MS-SQL database. In teamverband wordt de functionaliteit bepaald en vastgelegd. Documenten, ontwikkeltraject en change-logs worden beheerd binnen onze beheeromgeving. Na uitvoerige testen worden aangepaste functies geïmplementeerd of nieuwe functies toegevoegd. Als software engineer werk je in teamverband, ben je analytisch van aard en vernieuwend bezig. Werkinhoudelijk: Analyseren en adviseren m.b.t. ontwikkeltechnieken en tools

Bekijk vacature »

Pascal Schuffelers

Pascal Schuffelers

02/10/2018 20:02:21
Quote Anchor link
Ik heb dit stukje dat mijn gegevens weg schrijft.:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
$pdo = Database::connect();
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "INSERT INTO metingen (Datum, Tijd, Product, Prod_Nr, Batch_Nr, Orders, Lijn, FP, PeroxideType, PeroxideProcent, FlakeA, FlakeSiloA, FlakeB, FlakeSiloB, AggloProcent, AggloSilo, RecycleProcent, RecycleSilo, MVRml10ml, MVRSTD, MFRg10ml, AshProcent, VochtProcent, KleurL, KleurA, KleurB, Operator1, FlakeType1, FlakeType2, Productielijn1, Productielijn2, FlakeBatchNr1, FlakeBatchNr2, FlakeVochtProcent1, FlakeVochtProcent2, FlakeKleurL1, FlakeKleurL2, FlakeKleurA1, FlakeKleurA2, FlakeKleurB1, FlakeKleurB2, Remark1, Remark2, MeltDens) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
            $q = $pdo->prepare($sql);
            $q->execute(array( $Datum, $Tijd, $Product, $Prod_Nr, $Batch_Nr, $Orders, $Lijn, $FP, $PeroxideType, $PeroxideProcent, $FlakeA, $FlakeSiloA, $FlakeB, $FlakeSiloB, $AggloProcent, $AggloSilo, $RecycleProcent, $RecycleSilo, $MVRml10ml, $MVRSTD, $MFRg10ml, $AshProcent, $VochtProcent, $KleurL, $KleurA, $KleurB, $Operator1, $FlakeType1, $FlakeType2, $Productielijn1, $Productielijn2, $FlakeBatchNr1, $FlakeBatchNr2, $FlakeVochtProcent1, $FlakeVochtProcent2, $FlakeKleurL1, $FlakeKleurL2, $FlakeKleurA1, $FlakeKleurA2, $FlakeKleurB1, $FlakeKleurB2, $Remark1, $Remark2, $MeltDens));
            Database::disconnect();
            header("Location: indexnew2019.php");


Dit gaat goed maar omdat $Product in mijn dropdown een Id geeft wil ik dus voor de insert eerst die Id uitlezen via PDO zodat ik de naam door krijgt.

Dus dacht ik het volgende te kunnen doen.:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if ($valid) {
            $prod = $_POST['prod'];
            $pdo1 = Database::connect();
            $pdo1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql1 = "SELECT DISTINCT Id, RNaam FROM specsv1 WHERE RActive = 'y' group by RNaam AND Id = $prod";
            $q1 = $pdo1->prepare($sql1);
            $q1->execute(array($Id,$RNaam));
            while($row1 = $q1->fetch_assoc()) {
                $Product = $row1["RNaam"];}
            Database::disconnect();

            $pdo = Database::connect();
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "INSERT INTO metingen (Datum, Tijd, Product, Prod_Nr, Batch_Nr, Orders, Lijn, FP, PeroxideType, PeroxideProcent, FlakeA, FlakeSiloA, FlakeB, FlakeSiloB, AggloProcent, AggloSilo, RecycleProcent, RecycleSilo, MVRml10ml, MVRSTD, MFRg10ml, AshProcent, VochtProcent, KleurL, KleurA, KleurB, Operator1, FlakeType1, FlakeType2, Productielijn1, Productielijn2, FlakeBatchNr1, FlakeBatchNr2, FlakeVochtProcent1, FlakeVochtProcent2, FlakeKleurL1, FlakeKleurL2, FlakeKleurA1, FlakeKleurA2, FlakeKleurB1, FlakeKleurB2, Remark1, Remark2, MeltDens) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
            $q = $pdo->prepare($sql);
            $q->execute(array( $Datum, $Tijd, $Product, $Prod_Nr, $Batch_Nr, $Orders, $Lijn, $FP, $PeroxideType, $PeroxideProcent, $FlakeA, $FlakeSiloA, $FlakeB, $FlakeSiloB, $AggloProcent, $AggloSilo, $RecycleProcent, $RecycleSilo, $MVRml10ml, $MVRSTD, $MFRg10ml, $AshProcent, $VochtProcent, $KleurL, $KleurA, $KleurB, $Operator1, $FlakeType1, $FlakeType2, $Productielijn1, $Productielijn2, $FlakeBatchNr1, $FlakeBatchNr2, $FlakeVochtProcent1, $FlakeVochtProcent2, $FlakeKleurL1, $FlakeKleurL2, $FlakeKleurA1, $FlakeKleurA2, $FlakeKleurB1, $FlakeKleurB2, $Remark1, $Remark2, $MeltDens));
            Database::disconnect();
            header("Location: indexnew2019.php");
        }


Maar dan krijg ik een http error 500 fout en met verder uitzoeken komt het door dit stukje.:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
while($row1 = $q1->fetch_assoc()) {
                $Product = $row1["RNaam"];}
            Database::disconnect();


Waarom gaat het fout en hoe krijg ik dit werkend?
Dit is de enigste manier die werkend is voor mij , dus ik stap liever niet over naar een andere manier als het echt niet nodig is.
Gewijzigd op 02/10/2018 20:03:03 door Pascal Schuffelers
 
PHP hulp

PHP hulp

22/08/2019 18:45:31
 
- Ariën -
Beheerder

- Ariën -

02/10/2018 20:27:44
Quote Anchor link
Wat zegt je error_log?
 
Pascal Schuffelers

Pascal Schuffelers

02/10/2018 20:52:08
Quote Anchor link
Heb het eindelijk gevonden.
De code die werkt is dit.:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
$prod = $_POST['prod'];
            $pdo = Database::connect();
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "SELECT DISTINCT RNaam FROM specsv1 WHERE RActive = 'y' and Id = $prod";
            $q = $pdo->prepare($sql);
            $q->execute(array($RNaam));
            $row = $q -> fetch();
            $Product = $row["RNaam"];


het lag hieraan wat ik dus niet had.:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$q->execute(array($RNaam));
 
Ben van Velzen

Ben van Velzen

02/10/2018 21:37:02
Quote Anchor link
Waarom gebruik je prepared statements maar zet je toch de variabelen handmatig in de query? Zo heb je geen enkele zekerheid over wat er in je query gaat en lig je dus wijd open voor SQL injectie.
 
Thomas van den Heuvel

Thomas van den Heuvel

02/10/2018 22:55:20
Quote Anchor link
Als je ATTR_ERRMODE gelijk is aan ERRMODE_EXCEPTION zou ik op zijn minst een try-catch block verwachten. Als je die niet hebt resulteert een niet-gevangen exception in een Fatal Error die waarschijnlijk roet in het eten gooit in de vorm van output voordat je een header probeert te verzenden.

En wat @Ben zei, als je de principes niet snapt, is elke vorm van veiligheid/beveiliging een wassen neus.
Gewijzigd op 02/10/2018 22:55:42 door Thomas van den Heuvel
 
Pascal Schuffelers

Pascal Schuffelers

03/10/2018 17:53:21
Quote Anchor link
Een klein vraagje nog.
Ik heb deze code.:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
$pdo = Database::connect();
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "INSERT INTO metingen (Datum, Tijd, Product, Prod_Nr, Batch_Nr, Orders, Lijn, FP, PeroxideType, PeroxideProcent, FlakeA, FlakeSiloA, FlakeB, FlakeSiloB, AggloProcent, AggloSilo, RecycleProcent, RecycleSilo, MVRml10ml, MVRSTD, MFRg10ml, AshProcent, VochtProcent, KleurL, KleurA, KleurB, Operator1, FlakeType1, FlakeType2, Productielijn1, Productielijn2, FlakeBatchNr1, FlakeBatchNr2, FlakeVochtProcent1, FlakeVochtProcent2, FlakeKleurL1, FlakeKleurL2, FlakeKleurA1, FlakeKleurA2, FlakeKleurB1, FlakeKleurB2, Remark1, Remark2, MeltDens) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
            $q = $pdo->prepare($sql);
            $q->execute(array( $Datum, $Tijd, $Product, $Prod_Nr, $Batch_Nr, $Orders, 'Lijn1', $FP, $PeroxideType, $PeroxideProcent, $FlakeA, $FlakeSiloA, $FlakeB, $FlakeSiloB, $AggloProcent, $AggloSilo, $RecycleProcent, $RecycleSilo, $MVRml10ml, $MVRSTD, $MFRg10ml, $AshProcent, $VochtProcent, $KleurL, $KleurA, $KleurB, $Operator1, $FlakeType1, $FlakeType2, $Productielijn1, $Productielijn2, $FlakeBatchNr1, $FlakeBatchNr2, $FlakeVochtProcent1, $FlakeVochtProcent2, $FlakeKleurL1, $FlakeKleurL2, $FlakeKleurA1, $FlakeKleurA2, $FlakeKleurB1, $FlakeKleurB2, $Remark1, $Remark2, $MeltDens));
            Database::disconnect();


Nu wil ik graag , als de insert gelukt is een melding krijgen.
dacht dit stukje voor de disconnect te plaatsen, maar dat werkt niet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
echo  "<div id='dialog' title='QCP dialog' style='width:864px;'>" ;
            echo  "<p>Uw ingevulde data is met succes opgeslagen.</p>";
            echo  "</div>";
 
- Ariën -
Beheerder

- Ariën -

03/10/2018 18:07:32
Quote Anchor link
Waarom zet je jouw connectie niet in een globaal bestand die je van te voren inlaadt? Nu voer je steeds opnieuw een 'dure' connectie uit, terwijl dat prima eenmalig kan.

En waarom een echo per regel?

En heb je bovenstaande reacties al gelezen?
Lees ook eens: https://www.w3schools.com/php/php_mysql_prepared_statements.asp
Gewijzigd op 03/10/2018 18:08:34 door - Ariën -
 
Adoptive Solution

Adoptive Solution

03/10/2018 18:08:19
Quote Anchor link
Volgens de handleiding :

http://docs.php.net/manual/en/pdostatement.execute.php

geeft $q->execute() false of true terug.
 
Pascal Schuffelers

Pascal Schuffelers

03/10/2018 20:57:54
Quote Anchor link
hoe moet ik dat dan opzetten daarmee?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
if ($q-> execute == true){
toon dialoog dat het is opgeslagen
}else{
toon dialoog dat het niet opgeslagen is}


zo iets?
 
- Ariën -
Beheerder

- Ariën -

03/10/2018 21:23:21
Quote Anchor link
Lijn 5 zou ik dan in een aparte variabele zetten, en die gebruiken in je if-else-statement.
 
Pascal Schuffelers

Pascal Schuffelers

04/10/2018 05:45:20
Quote Anchor link
hoe bedoel je Ariën?
 
Adoptive Solution

Adoptive Solution

04/10/2018 07:32:27
Quote Anchor link
Ariën bedoelt zoiets :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$result
= $q->execute( array( de rest ) );
if ( $result == TRUE ) {
    // dingen doen als het waar is
} elseif ( $result == FALSE ) {
    // dingen doen als het niet waar is
}
?>
 
Thomas van den Heuvel

Thomas van den Heuvel

04/10/2018 09:21:51
Quote Anchor link
Het lijkt mij niet direct nodig om dit expliciet met true of false te vergelijken.

Sowieso zou alles wat in een if-statement staat (eigenlijk al) moeten evalueren tot een Boolse waarde, maar in PHP wordt dat nogal eens over het hoofd gezien omdat de taal zelf niet zo moeilijk doet over het exacte type van een expressie.

EDIT: daarbij loont het misschien ook de moeite om in het else-statement een (custom) exception te throwen als je van exceptions gebruik maakt.
Gewijzigd op 04/10/2018 09:24:50 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.