Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Inputten in Mysql database adhv foreach

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil voor mezelf een volledig functionele afmeld formulier aanmaken enkel met de bedoeling om te blijven bijleren.

Deze keer had ik heel graag een form verwerkt door de $_POST in een foreach loop te steken en adh daarvan de values toe te voegen aan mijn MYSQL database. Hieronder vind je ongeveer de opgemaakte code terug maar ik blijk er maar niet in te slagen om adh daarvan het systeem werkende te krijgen.

Extra wil ik ook dat alle niet ingevulde velden of velden die reeds ingevuld zijn van deze id (in de database) overgeslagen worden zodat ze niet terug kunnen overschreven worden. Het is wel de bedoeling dat ik nu bijvoorbeeld 3 velden invul en morgen 3 andere en dat deze natuurlijk netjes bijgevoegd worden in de database tabel.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$getadmrmaid        = $_GET['id'];

$admrmadetstmt  = $dbh->prepare("SELECT * FROM rma_detail
            LEFT JOIN rma ON rma_detail.rd_rma_id=rma.r_id
            LEFT JOIN klanten ON rma.r_klantid=klanten.k_id
            LEFT JOIN contactpersonen ON rma.r_contactid=contactpersonen.c_id
            WHERE rd_rma_nr = ?");
$admrmadetstmt->bindParam(1,$getadmrmaid);                      
$admrmadetstmt->execute();
$admrmadetrow = $admrmadetstmt->fetch(PDO::FETCH_ASSOC);    

if ($_SERVER['REQUEST_METHOD'] == 'POST'){

foreach ($_POST as $key => $value){
         if (!empty($_POST[$key]) && $admrmadetrow[$key] !== $value){
$uprmadetstmt = $dbh->prepare("UPDATE rma_detail SET $key = ? WHERE rd_id = $getadmrmaid");
$uprmadetstmt->bindParam(1, $value);
$uprmadetstmt->execute();
    }
    }
}


Is er iemand die enig idee heeft wat ik verkeert aan het doen ben en waarom dit dan ook niet blijkt te werken. Ik krijg geen foutmelding alles ziet ernaar uit alsof die succesvol behandeld wordt maar toch komen de gedane "UPDATES" niet in de tabel terecht.

Bedankt voor de hulp!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 05-11 17:53
1) Ondanks het gebruik van PDO ben je nog steeds vatbaar voor SQL Injectie (Je zet direct waardes vanuit post in een update statement, in plaats van dit met een bindParam te doen (Regel 16 de variable $key en $getadmrmaid)).
2) Krijg je wel de goede waardes mee in je Post, dus bestaan de waardes die je probeert te updaten wel in je rma_detail tabel? (Wat geeft var_dump($_POST); als output?)

- edit:
Je gebruikt de verkeerde key in de update? (in je select gebruik je 'rd_rma_id' en in je update probeer je te updaten met 'rd_id'

-- edit 2:
Wat als ik nu dit doe: 'index.php?id=1 OR 1=1, dan worden alle rijen geupdate?

[ Voor 24% gewijzigd door naam op 19-05-2014 16:47 ]


Verwijderd

Topicstarter
naam schreef op maandag 19 mei 2014 @ 16:44:
1) Ondanks het gebruik van PDO ben je nog steeds vatbaar voor SQL Injectie (Je zet direct waardes vanuit post in een update statement, in plaats van dit met een bindParam te doen (Regel 16 de variable $key).
2) Krijg je wel de goede waardes mee in je Post, dus bestaan de waardes die je probeert te updaten wel in je rma_detail tabel? (Wat geeft var_dump($_POST); als output?)
Beste bedankt voor uw antwoord. Ik kan inderdaad die $key ook nog via bindparam invoegen in de update statement. Hoewel ik nu net denk dat daar mijn probleem zit. Als ik een var dump doe van $admrmadetstmt dan krijg ik iets als : "UPDATE rma_detail SET $rd_retour = ? WHERE rd_id = 2014051905" Dus zie ik op die manier dat mijn bind niet werkt. Als ik het dan gewoon rechtstreeks probeer met UPDATE rma_detail SET $key = $value WHERE rd_id = $getadmrmaid (ik weet dit is niet veilig) denk ik wel dat het lukt al krijg ik nu nog een andere melding die hoogstwaarschijnlijk aan een typfout in mijn <input name=""> Foutmelding die ik nu krijg is : Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column ' ' in 'field list''

Antwoord op uw edit 1:

Ah stom van mij ik heb daar inderdaad gemist!

Antwoord op uw edit 2:

Ik begrijp wat je wil zeggen, maar laat het me zo zeggen dat ik nu bezig ben met alles uit de foreach loop aan het halen ben om mijn codes die ik vroeger gebruikte te verkorten of veel te verkorten. Bedankt voor uw tip betreft de injectie ik weet wat ermee te doen ik had het nu even op die manier uit geschreven om uit te sluiten dat dit het probleem was

[ Voor 44% gewijzigd door Verwijderd op 19-05-2014 16:55 ]


  • naam
  • Registratie: Oktober 2007
  • Laatst online: 05-11 17:53
Die $admrmadetstmt lijkt nu een hele andere query te zijn dan waarmee je de $dbh->prepare uitvoert, klopt dat? Probeer daarnaast ook wat duidelijkere namen te kiezen voor variabelen ($admrmadetstmt wordt dan bijvoorbeeld $admin_rma_detail_stmt), dit maakt het voor jezelf (en voor ons) duidelijker om te zien wat er gebeurt.

Verwijderd

Topicstarter
naam schreef op maandag 19 mei 2014 @ 16:58:
Die $admrmadetstmt lijkt nu een hele andere query te zijn dan waarmee je de $dbh->prepare uitvoert, klopt dat? Probeer daarnaast ook wat duidelijkere namen te kiezen voor variabelen ($admrmadetstmt wordt dan bijvoorbeeld $admin_rma_detail_stmt), dit maakt het voor jezelf (en voor ons) duidelijker om te zien wat er gebeurt.
Ja inderdaad ik heb namelijk in mijn form 3 tabellen 1 met de titels erin, een 2e met de (indien reeds aanwezig) values ingevuld en een derde met een form.

vb.

RMA ID2014051905
Omruilen of reparerenOmruilen<input type="text" name="rd_omr_rep" />
Retour gezonden<input type="text" name="rd_retour" />


Bezie het zo als de 2e kolom leeg is dan is deze stap nog niet uitgevoerd, anders wel dus als je dan een update doet via de 3e kolom dan zie je dit automatisch in de 2e kolom verschijnen na de submit. Beetje systeem van een zelfgemaakte CMS ofzo

Verwijderd

Topicstarter
@naam: Ben ik mis maar het is toch niet mogelijk om uw kolomnaam in een bind te stoppen? Kolomnamen zijn toch niet gevoelig voor injecties?

@Jessy100, blij dat je mijn andere post hebt gevonden op stackoverflow. Het is nooit slecht om die op 2 plaatsen te stellen niet iedereen heeft dezelfde ideeën en soms leren die mij ineens 2 methodes.

  • Soundless
  • Registratie: November 2008
  • Laatst online: 29-10 16:54
Verwijderd schreef op maandag 19 mei 2014 @ 22:01:
@naam: Ben ik mis maar het is toch niet mogelijk om uw kolomnaam in een bind te stoppen? Kolomnamen zijn toch niet gevoelig voor injecties?

@Jessy100, blij dat je mijn andere post hebt gevonden op stackoverflow. Het is nooit slecht om die op 2 plaatsen te stellen niet iedereen heeft dezelfde ideeën en soms leren die mij ineens 2 methodes.
Ja en nee. Je kan een kolomnaam niet zomaar in een bind gooien. Wel is een kolomnaam, net als alles wat je in een query gooi, gevoelig zolang het van buitenaf komt.

Je kolomnamen komen uit een POST en dus is het gevoelig voor SQL injection
Pagina: 1