Array naar een Database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sander van Schalken

Sander van Schalken

10/09/2013 10:40:15
Quote Anchor link
Ik krijg het niet voor elkaar een array in een database te plaatsen. Wie weet er raad?
Ik vermoed dat het met een implode moet. Dit is wat ik tot nu toe heb:
// de array heeft de naam $r --> $r[] = array (
$string=implode("','",$r);
mysql_query("INSERT INTO test ('', url, name, location, phone) VALUES ('$string')");


De array ziet er als volgt uit (40 velden totaal)
Array
(
[0] => Array
(
=> Array
(
[0] => http://variety411.com/us/ny/advertising-agencies/aa-group/
)

[name] => Array
(
[0] => A&A Group
)

[location] => Array
(
[0] => New York, NY
)

[phone] => Array
(
[0] => (212) 239-7360
)

)

De Database als volgt:
CREATE TABLE IF NOT EXISTS `test` (
`id` int(10) unsigned NOT NULL auto_increment,
`url` varchar(200) NOT NULL default '',
`name` varchar(200) NOT NULL default '',
`location` varchar(200) NOT NULL default '',
`phone` varchar(200) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=123 ;
Gewijzigd op 10/09/2013 11:55:11 door Sander van Schalken
 
PHP hulp

PHP hulp

15/05/2024 16:37:49
 
Erwin H

Erwin H

10/09/2013 11:07:32
Quote Anchor link
Voor je die implode doet, eerst even een fout uit je query halen. Een auto_increment veld moet je niet in je insert query opnemen. Die vult de database namelijk zelf in. Vul je een lege waarde in dan gaat het wel goed, maar je krijgt wel een warning van de database dat er iets niet goed ging. Alleen wat jij nu doet gaat wel echt fout, want je vult nu een lege string in als kolomnaam en dat kan in geen geval.

Dan je implode van de waardes, dat zal een dubbele moeten worden. Als je namelijk meerdere records tegelijk wilt invoeren moet dat op deze manier:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
INSERT INTO test (url, name, location, phone)
VALUES ('url', 'name', 'location', 'phone'), ('url', 'name', 'location', 'phone'), ('url', 'name', 'location', 'phone');


Je moet dus eerst een implode maken per record en dan voor alle records:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$records
= array();
foreach( $r as $data ){
  $records[] = "('".implode( "','", $data )."')";
}

$records = implode( ',', $records );

mysql_query( "INSERT INTO test (url, name, location, phone) VALUES ".$records );
?>
Gewijzigd op 10/09/2013 12:10:26 door Erwin H
 
Sander van Schalken

Sander van Schalken

10/09/2013 11:57:33
Quote Anchor link
Ahh... een dubbele implode, daar had ik echt nooit aan gedacht. Bedankt!
Ik heb de database gewijzigd naar:
CREATE TABLE IF NOT EXISTS `test` (
`id` int(10) NOT NULL,
`url` varchar(200) NOT NULL default '',
`name` varchar(200) NOT NULL default '',
`location` varchar(200) NOT NULL default '',
`phone` varchar(200) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Hierna de code erin gezet, maar er komen geen records in de database.
Ik krijg ook geen foutmeldingen, dus ik heb geen flauw idee waar het niet goed zit?!

Wel gevonden dat $records het volgende gaf: ("Array','Array','Array','Array"),
Hierna de desbetreffende regel gewijzigd naar: $records[] = '(\''.implode( "','", $data ).'\')';

De foutmeldingen aangezet. Ik krijg:
<b>Notice</b>: Array to string conversion in <b>/test.php</b> on line <b>59</b><br />
Regel 59 is bij mij: $records[] = '("'.implode( "\",\"", $data ).'")';
Gewijzigd op 10/09/2013 12:11:55 door Sander van Schalken
 
Erwin H

Erwin H

10/09/2013 12:09:58
Quote Anchor link
Je hebt nu je auto increment van je id afgehaald, maar er wel een NOT NULL bij laten staan. Dat betekent dat je WEL je id moet opnemen in een insert, met een correcte integer waarde. Die waarde moet overigens dan ook nog uniek zijn omdat je er een primary key op hebt zitten.

De fout in mijn script zat overigens in wat omgedraaide quotes. Heb ik nu aangepast.

Het 'ik krijg geen foutmeldingen' ligt wellicht aan het feit dat je dat niet controleert?
Gewijzigd op 10/09/2013 12:11:30 door Erwin H
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/09/2013 12:13:33
Quote Anchor link
Sander van Schalken op 10/09/2013 10:40:15:

De array ziet er als volgt uit (40 velden totaal)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Array
(
    [0] => Array
        (
            [url] => Array
                (
                    [0] => http://variety411.com/us/ny/advertising-agencies/aa-group/
                )

            [name] => Array
                (
                    [0] => A&A Group
                )

            [location] => Array
                (
                    [0] => New York, NY
                )

            [phone] => Array
                (
                    [0] => (212) 239-7360
                )

        )

Al je waardes in de array zijn ook weer arrays, dus dan kan je imploden zoveel je wilt, maar met een heel vreemd resultaat zoals je zelf ook al geconstateerd hebt.
Gewijzigd op 10/09/2013 12:14:01 door Ger van Steenderen
 
Erwin H

Erwin H

10/09/2013 12:15:18
Quote Anchor link
Ah, maar er zit nog een probleem in je array zie ik nu. Elk veld is niet een string, maar een array, met daarin een string. Dan kan je het niet meer met een implode doen. De eerste implode (binnen de foreach) zal je anders moeten doen. Je zal elk element af moeten lopen om de waardes eruit te krijgen.

(Ger was me voor)
Gewijzigd op 10/09/2013 12:15:45 door Erwin H
 
Sander van Schalken

Sander van Schalken

10/09/2013 13:34:09
Quote Anchor link
Jeetje, ingewikkeld zeg. Ik was al blij dat ik de data op mijn scherm kreeg, in een DB is andere koek.
Hoe ik de eerste implode dien te veranderen weet ik echt niet?!
Voor de volledigheid hier de code zoals ik het nu heb:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?
$r
= array();
for ($ix = 0; $ix < count($rows); $ix++) {
    $tmp = $rows[$ix];
    
    // scrape uit de content met CURL
    $match_url = $scrape->fetchAllBetween('href="','"',$tmp,false);
    $match_name = $scrape->fetchAllBetween('post-id="','</a>',$tmp,false);
    $match_location = $scrape->fetchAllBetween('location">','</p>',$tmp,false);
    $match_phone = $scrape->fetchAllBetween('phone">','</p>',$tmp,false);

    $r[] = array (

    'url' => $match_url[0],
    'name' => $match_name[0],
    'location' => $match_location[0],
    'phone' => $match_phone[0]);

    }


//    print_r($r);

// DB connect

require_once("libraries/dbasl.inc.php");
db_connect();
$records = array();
foreach( $r as $data ){
  $records[] = "('".implode( "','", $data )."')";
}

$records = implode( ',', $records );

mysql_query( "INSERT INTO test (url, name, location, phone) VALUES ".$records );
print_r($records);
?>


en de DB zet er met bovenstaande script de waarde 'array' in.
het veld ID heb ik op andere waardes gezet dan NOT NULL en auto increment, maar dat werkte niet goed.
Nu ziet deze er als volgt uit:
CREATE TABLE IF NOT EXISTS `test` (
`id` int(10) NOT NULL auto_increment,
`url` varchar(200) NOT NULL default '',
`name` varchar(200) NOT NULL default '',
`location` varchar(200) NOT NULL default '',
`phone` varchar(200) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=934 ;
Gewijzigd op 10/09/2013 14:00:41 door Sander van Schalken
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/09/2013 13:47:24
Quote Anchor link
Als je goed nadenkt dan weet je dat dus $match_* arrays zijn. Maak daar $match_*[0] van, dan ben je al een heel eind.
 
Sander van Schalken

Sander van Schalken

10/09/2013 14:00:15
Quote Anchor link
Bedankt, nu doet deze het wel. Bovenstaande code heb ik aangepast.
 



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.