Array naar een Database
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
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)
1
2
2
INSERT INTO test (url, name, location, phone)
VALUES ('url', 'name', 'location', 'phone'), ('url', 'name', 'location', 'phone'), ('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)
1
2
3
4
5
6
7
8
9
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 );
?>
$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
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
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
Sander van Schalken op 10/09/2013 10:40:15:
De array ziet er als volgt uit (40 velden totaal)
De array ziet er als volgt uit (40 velden totaal)
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
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)
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
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);
?>
$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
Als je goed nadenkt dan weet je dat dus $match_* arrays zijn. Maak daar $match_*[0] van, dan ben je al een heel eind.
Bedankt, nu doet deze het wel. Bovenstaande code heb ik aangepast.