array within array => wegschrijven in tabel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jennifer Van W

Jennifer Van W

16/03/2015 17:17:26
Quote Anchor link
Hi,

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
foreach($values as $row => $innerArray){
  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.
 
PHP hulp

PHP hulp

23/12/2024 00:01:23
 
Thomas van den Heuvel

Thomas van den Heuvel

16/03/2015 17:30:11
Quote Anchor link
Je hebt de binnenste foreach niet per se nodig als je weet welke kolom welke info bevat? Je $innerArray is equivalent met één weg te schrijven record als ik het goed begrijp?

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.
 
Jennifer Van W

Jennifer Van W

17/03/2015 08:25:04
Quote Anchor link
Hi $values ziet er zo uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
foreach($values as $row => $innerArray){
  
    echo $innerArray['A'].'-' .$innerArray['B'].'-'.$innerArray['C']. "<br/>";
  
}
 
Ward van der Put
Moderator

Ward van der Put

17/03/2015 09:23:45
Quote Anchor link
De query die je nodig hebt, heeft deze vorm:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
INSERT INTO
  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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

17/03/2015 09:32:29
Quote Anchor link
Je kan er een bulk in sert van maken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$bulk
= array();
foreach ($values as $innerArray)
    $bulk[] = "(" . $this->db->escape($innerArray['A'] . "," . $this->db->escape($innerArray['B'] .
            ',' . $this->db->escape($innerArray['C'] . ')';
}


$sql = 'IN SERT  INTO subscribers (voornaam,achternaam,email)
    VALUES '
. implode(',', $bulk);
?>

Even de spatie uit IN SERT halen zonder die krijg het niet gepost
 
Jennifer Van W

Jennifer Van W

17/03/2015 09:43:55
Quote Anchor link
Hi Ward en Ger, bedankt voor je reactie!

Ik heb deze geprobeerd en werkt of is dit niet goed?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
    }
 
Ward van der Put
Moderator

Ward van der Put

17/03/2015 10:06:53
Quote Anchor link
Lijkt me goed, maar je moet nog wel escapes toevoegen voor het geval waarden een ' bevatten.
 
Jennifer Van W

Jennifer Van W

17/03/2015 10:11:53
Quote Anchor link
OK snap ik, maar hoe noteer ik dat? zoals Ger aangeeft?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$values[] = '("' .  escape($value['A']) .'","'
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

17/03/2015 10:14:14
Quote Anchor link
Als je de escape functie van CI gebruikt hoef je de strings ook niet te quoten, dit doet de escape functie.

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
 
Jennifer Van W

Jennifer Van W

17/03/2015 10:17:12
Quote Anchor link
Dus zo: ?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$values[] = '(' .  escape($value['A']) .','........


of zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$values[] = '(" .  escape($value['A']) .","........
Gewijzigd op 17/03/2015 10:19:17 door Jennifer Van W
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

17/03/2015 11:28:00
Quote Anchor link
De eerste maar wel met $this->db->escape (escape is geen core ci functie maar onderdeel van de databasedriver)
 
Jennifer Van W

Jennifer Van W

17/03/2015 11:38:03
Quote Anchor link
Ger (en ook Ward), heel erg bedankt (je had het eigenlijk al eerder beschreven). Het werkt nu perfect.
 
Jennifer Van W

Jennifer Van W

22/03/2015 18:21:40
Quote Anchor link
Ik heb toch nog een vraagje met betrekking tot bovenstaaand:

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
 
- SanThe -

- SanThe -

22/03/2015 18:27:06
Quote Anchor link
Kijk eens naar:
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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/03/2015 20:08:17
Quote Anchor link
Zet een unique index op de kolom email:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
CRE ATE UNIQUE INDEX ON subscribers (email)

Dan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
INSERT IGNORE INTO ......

Of als je de andere velden wilt aanpassen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)
Gewijzigd op 22/03/2015 20:10:00 door Ger van Steenderen
 
Jennifer Van W

Jennifer Van W

23/03/2015 08:39:28
Quote Anchor link
Hi Ger, hoeft er dan geen kolom met een id (nummering) in de tabel? Dus email is dan de primary key?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/03/2015 12:03:42
Quote Anchor link
Database technisch gezien zou email de primary key kunnen zijn.
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.
 
Jennifer Van W

Jennifer Van W

23/03/2015 12:20:37
Quote Anchor link
OK, ik heb hier helaas geen ervaring mee ;-(.....

Schrijf je jouw eerst genoemde code dan in de query of is het een instelling in je database?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/03/2015 13:19:47
Quote Anchor link
De cre-ate index statement is eenmalig, maar je kan dit ook via een database tool zoals Workbench of PHPMyAdmin doen.
 
Jennifer Van W

Jennifer Van W

23/03/2015 13:34:46
Quote Anchor link
Ik heb het via PHPMyAdmin gedaan en kon dit via een optie doen, is dit het:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
ALTER TABLE `subscribers` ADD UNIQUE(`email`);


Toevoeging op 23/03/2015 15:24:02:

Gelukt ;-)
 



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.