Bij bindParam kun je een value opgeven en als je die value verandert dan verandert dit ook bij het uitvoeren van de query. Voorbeeldje:
<?php
$values = array('bob', 'alice', 'lisa', 'john');
$name = '';
$stmt = $db->prepare("INSERT INTO table(`name`) VALUES(:name)");
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
foreach($values as $name) {
$stmt->execute();
}
?>
Nu wil ik niet iedere keer het datatype meegeven aan bindParam, maar dat via een eigen method laten regelen. Dus bijv. zoiets.
<?php
$db->setValues('name' => $name, 'age' => $age);
?>
Vanuit de setValues() method zou ik dan de bindParams() kunnen instellen met het juiste data type.
Maaaar...
In de setValues functie ben ik de koppeling kwijt tussen de values. In de setValues() functie zou je zoiets krijgen als:
<?php
foreach ($array as $k => $v) {
// $data_type instellen
$stmt->bindParam($k, $v, $data_type);
}
?>
En hier gaat mijn vraag eigenlijk om. Bij bindParam() in de foreach loop is het 2e argument $v. De bindParam functie zal dus niet $name blijven volgen, maar $v. Is er een manier om te zorgen dat $name wordt gevolgd en niet $v? Ik heb al wat geprobeerd met by reference door te geven maar het lukt niet echt. Of kan dit gewoon helemaal niet?
Is er een manier om te zorgen dat $name wordt gevolgd en niet $v? Ik heb al wat geprobeerd met by reference door te geven maar het lukt niet echt. Of kan dit gewoon helemaal niet?
Ik ben zelf nog maar sinds kort PDO gaan gebruiken, dus ben geen expert in PDO, maar jouw probleem komt mij bekend voor.
Je doorloopt je array nu met een foreach-loop, waarbij je variabele gebruikt die steeds weer anders zijn (namelijk $k en $v). Ik dacht dit te kunnen oplossen met een klassieke loop:
Ik snap niet helemaal waar je het ineens over hebt, maar heb je het werkend gekregen wat ik bedoelde?
Je kan het natuurlijk ook zelf uitproberen. Ik heb zelf geen zin een databaseje te gaan verzinnen om dit te testen.
Om een poging te doen uit te leggen wat ik bedoel:
bindParam is voor het 'binden' van variabelen aan een parameter. Dit vereist dat de variabelen blijven bestaan bestaan. Je voert immers een execute uit nadat je bindParam hebt toegepast. Als de gebruikte variabelen in bindParam niet meer bestaan voordat je execute uitvoert, dan gaat je code mopperen.
Meer verhaal hierover kun je denk ik wel vinden door te zoeken op dingen als 'bindParam vs bindValue'.
In jouw foreach-loop heb je te maken met een variabele $k en een variabele $v. Buiten deze foreach-loop bestaat geen variabele $v, noch variabele $k. Dit maakt het niet mogelijk deze variabelen te binden.
Door gebruik te maken van een gewone for-loop kun je variabelen koppelen die wel blijven bestaan. Immers bestaan $keys[1] en $array[1] zowel in de for-loop als buiten de for-loop.
@Wouter, volgens mij had ik dat ook geprobeerd, maar die foreach stond in een class method en dat werkte niet.
Kevin Driessen op 16/05/2013 12:17:50
Je kan het natuurlijk ook zelf uitproberen. Ik heb zelf geen zin een databaseje te gaan verzinnen om dit te testen.
Waarom reageer je zo vijandig. Ik vraag jou toch helemaal niet om "een databaseje te gaan verzinnen om dit te testen". Jij reageert in mijn topic en ik vraag vervolgens of het je gelukt is.