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:


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.
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.
Hi $values ziet er zo uit:


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 ;-)

[size=xsmall]Toevoeging op 17/03/2015 08:31:46:[/size]

mmmmm: ik kom al in de buurt


foreach($values as $row => $innerArray){
  
    echo $innerArray['A'].'-' .$innerArray['B'].'-'.$innerArray['C']. "<br/>";
  
}


De query die je nodig hebt, heeft deze vorm:

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.
Je kan er een bulk in sert van maken:
<?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
Hi Ward en Ger, bedankt voor je reactie!

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


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);
    }
Lijkt me goed, maar je moet nog wel escapes toevoegen voor het geval waarden een ' bevatten.
OK snap ik, maar hoe noteer ik dat? zoals Ger aangeeft?


$values[] = '("' .  escape($value['A']) .'","'
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.)
Dus zo: ?


$values[] = '(' .  escape($value['A']) .','........ 


of zo:


$values[] = '(" .  escape($value['A']) .","........ 
De eerste maar wel met $this->db->escape (escape is geen core ci functie maar onderdeel van de databasedriver)

Reageren