Bypass voor error = Invalid parameter number:
Ik heb dit
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
INSERT INTO blabla
crs_link_inschrijving, crs_link_cv, crs_link_trajectplan,
crs_link_certificaten, crs_link_rapportage,
crs_link_aanwezigheid)
VALUES (
:inschrijving, :cv, :trajectplan,
:certificaten, :rapportage, :aanwezigheid,)");
?>
INSERT INTO blabla
crs_link_inschrijving, crs_link_cv, crs_link_trajectplan,
crs_link_certificaten, crs_link_rapportage,
crs_link_aanwezigheid)
VALUES (
:inschrijving, :cv, :trajectplan,
:certificaten, :rapportage, :aanwezigheid,)");
?>
Nu is het niet zeker (en dat mag) dat die 6 waardes worden gehaald in de volgende foreach loop
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
?php
foreach ($links as $name_field => $dir_link)
{
$stmt->bindParam($name_field, $dir_link, PDO::PARAM_STR);
}
if ($stmt->execute())
?>
foreach ($links as $name_field => $dir_link)
{
$stmt->bindParam($name_field, $dir_link, PDO::PARAM_STR);
}
if ($stmt->execute())
?>
Dus als bijv de foreach maar 1/2/3/4 of 5 van de 6 waardes produceert hoe kan ik die andere toch leeglaten?
Gewijzigd op 10/07/2013 14:35:40 door Francoi gckx
Eerst controleren of de waarde leeg is of niet en afhankelijk daarvan PARAM_STR of PARAM_NULL kiezen
Toevoeging op 10/07/2013 14:51:34:
Dus dan moet ik via een omweg een array maken van de velden die er zijn
en dan $name_field controleren met de array?
Ik dacht dat $links array altijd uit die zes velden zou bestaan, dan had je op contoleren of een veld al dan niet ingevuld is.
Nee dat is dus niet zo het kunnen er max 6 zijn of maar 1 terwijl de INSERT VALUES altijd 6 zijn
Waarom zijn die insert values er dan altijd 6? Dat kan je natuurlijk ook gewoon variabel maken.
maar bij die 6 is het variabel
Wat zou een handige manier zijn?
Gewijzigd op 10/07/2013 15:38:18 door Francoi gckx
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//query opbouwen
$fields = array();
foreach ($links as $name_field => $dir_link){
$fields[] = $name_field;
}
$query = 'INSERT INTO table(field1, field2, field3';
if ( count( $fields ) > 0 ){
$query .= ', '.implode( ',', $fields );
}
$query .= ') VALUES (:field1, :field2, :field3';
if ( count( $fields ) > 0 ){
$query .= ', :'.implode( ', :', $fields );
}
$query .= ')';
?>
//query opbouwen
$fields = array();
foreach ($links as $name_field => $dir_link){
$fields[] = $name_field;
}
$query = 'INSERT INTO table(field1, field2, field3';
if ( count( $fields ) > 0 ){
$query .= ', '.implode( ',', $fields );
}
$query .= ') VALUES (:field1, :field2, :field3';
if ( count( $fields ) > 0 ){
$query .= ', :'.implode( ', :', $fields );
}
$query .= ')';
?>
En dan de rest, dus het preparen en het vullen van de parameters wat je al hed.
Twee opmerkingen:
1 - als de keys in je array niet gelijk zijn aan je velden in de database dan zal je in de eerst foreach loop dus een vertaling moeten maken van array key naar databaseveldnaam.
2 - de parameternaam wordt nu gelijk aan de databaseveldnaam. Dit is iets wat ik standaard doe, omdat je dan heel eenvoudig dit soort queries variabel kunt opbouwen.
Gewijzigd op 10/07/2013 16:34:23 door Erwin H
Nu ben ik sowieso al geen voorstander van nullable kolommen in een tabel, maar dit lijkt ook nog verdacht veel op repeterende kolommen.
Gewijzigd op 10/07/2013 23:11:55 door Francoi gckx