array within array => wegschrijven in tabel
Ik lees een excel file uit (via PHPExcel) bestaande uit 3 kolommen (email, voornaam en achternaam) en een aantal regels.
Er ontstaat een array in een array welke ik weer uitlees op bijvoorbeeld deze manier:
Code (php)
1
2
3
4
5
2
3
4
5
foreach($values as $row => $innerArray){
foreach($innerArray as $innerRow => $value){
echo $value . "<br/>";
}
}
foreach($innerArray as $innerRow => $value){
echo $value . "<br/>";
}
}
Echter hoe krijg ik deze waarde in mijn mysql tabel subscribers , bestaande uit de kolommen: id, email, first_name en last_name ?
Alvast bedankt voor jullie hulp.
Als de eerste kolom (met index 0) een (extern) id bevat, dan kun je hieraan refereren met $innerArray[0], je tweede kolom met $innerArray[1] etc.
Het hangt er een beetje vanaf hoe $values in elkaar zit.
Code (php)
1
Array ( [2] => Array ( [A] => [email protected] [B] => Minco [C] => Dermois ) [3] => Array ( [A] => [email protected] [B] => Patricia [C] => Detmers ) [4] => Array ( [A] => [email protected] [B] => Jan [C] => Doelen ) [5] => Array ( [A] => [email protected] [B] => Rob [C] => Dongelmans ) [6] => Array ( [A] => [email protected] [B] => Patricia [C] => Donker ) [7] => Array ( [A] => [email protected] [B] => Fons [C] => Dorrestijn ) [8] => Array ( [A] => [email protected] [B] => P. [C] => Duin ) [9] => Array ( [A] => [email protected] [B] => Mirjam [C] => Duivebode ) [10] => Array ( [A] => [email protected] [B] => Anita [C] => Ebbers ) [11] => Array ( [A] => [email protected] [B] => Hesam [C] => Ebrahimmalek ) [12] => Array ( [A] => [email protected] [B] => Dave [C] => Elbers ) [13] => Array ( [A] => [email protected] [B] => mjfm [C] => engelmann ) [14] => Array ( [A] => [email protected] [B] => Eric [C] => Faber ) [15] => Array ( [A] => [email protected] [B] => steven [C] => fernamd ) )
Ik zou graag willen weten hoe de query er uit moet zien om dit weg te schrijven ;-)
Toevoeging op 17/03/2015 08:31:46:
mmmmm: ik kom al in de buurt
Code (php)
1
2
3
4
5
6
2
3
4
5
6
INSERT INTO
tabelnaam (emailadres, voornaam, achternaam)
VALUES
('[email protected]', 'Minco', 'Dermois'),
('[email protected]', 'Patricia', 'Detmers'),
('[email protected]', 'Jan', 'Doelen');
tabelnaam (emailadres, voornaam, achternaam)
VALUES
('[email protected]', 'Minco', 'Dermois'),
('[email protected]', 'Patricia', 'Detmers'),
('[email protected]', 'Jan', 'Doelen');
Met andere woorden: per rij herhaal je de waarden uit de array voor (emailadres, voornaam, achternaam) in de databasetabel.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
Even de spatie uit IN SERT halen zonder die krijg het niet gepost
Ik heb deze geprobeerd en werkt of is dit niet goed?
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
function saveExcel($data){
$sql = 'INSERT INTO subscribers (email, first_name, last_name ) VALUES ';
$values = array();
foreach ($data as $value) {
$values[] = '("' . $value['A'] .'","' . $value['B'] . '","' . $value['C'] . '")';
}
$sql .= implode(',', $values);
$this->db->query($sql);
}
$sql = 'INSERT INTO subscribers (email, first_name, last_name ) VALUES ';
$values = array();
foreach ($data as $value) {
$values[] = '("' . $value['A'] .'","' . $value['B'] . '","' . $value['C'] . '")';
}
$sql .= implode(',', $values);
$this->db->query($sql);
}
Lijkt me goed, maar je moet nog wel escapes toevoegen voor het geval waarden een ' bevatten.
Het beste is ook om geen dubbele quotes te gebruiken, SQL standaard is enkele quotes voor strings, en dubbele quotes voor identifiers (tabelnamen, kolomnamen etc.)
Gewijzigd op 17/03/2015 10:15:44 door Ger van Steenderen
De eerste maar wel met $this->db->escape (escape is geen core ci functie maar onderdeel van de databasedriver)
Ger (en ook Ward), heel erg bedankt (je had het eigenlijk al eerder beschreven). Het werkt nu perfect.
De query gebruik ik voor het wegschrijven van emailadressen uit een Excel formulier naar een tabel. Maar nu wil voorkomen dat er doublures ontstaan, dus via een SELECT haal ik de bestaande gegevens uit de tabel.
mijn vraag ;-):
Hoe kan ik nu 2 arrays het beste met elkaar vergelijken en de doublures er uit halen?, zodat ik 1 nieuwe array krijg
Gewijzigd op 22/03/2015 18:22:10 door Jennifer Van W
http://php.net/manual/en/function.array-diff.php
Persoonlijk zou ik (indien beide array's nodig zijn) ze aan elkaar plakken en dan de unieke waarden pakken:
http://php.net/manual/en/function.array-merge.php
http://php.net/manual/en/function.array-unique.php
Dan:
Of als je de andere velden wilt aanpassen
Code (php)
1
2
3
4
2
3
4
INSERT INTO subscribers (email,first_name,last_name) VALUES(....,....,....),(....,....,....)
ON DUPLICATE KEY UPDATE
first_name = VALUES(first_name),
last_name = VALUES(last_name)
ON DUPLICATE KEY UPDATE
first_name = VALUES(first_name),
last_name = VALUES(last_name)
Gewijzigd op 22/03/2015 20:10:00 door Ger van Steenderen
Hi Ger, hoeft er dan geen kolom met een id (nummering) in de tabel? Dus email is dan de primary key?
Alleen moet je dan door heel de applicatie heen met dat emailadres gaan lopen leuren, dus dan is een surrogaat primary key een betere optie.
Schrijf je jouw eerst genoemde code dan in de query of is het een instelling in je database?
De cre-ate index statement is eenmalig, maar je kan dit ook via een database tool zoals Workbench of PHPMyAdmin doen.
Toevoeging op 23/03/2015 15:24:02:
Gelukt ;-)