max time out
Nu gebruik ik onderstaande code om een time out te voorkomen:
Ik krijg na veel succesvolle runs nu ineens een melding
Fatal error: Maximum execution time of 30 seconds exceeded in ***** on line 10
Bijzonder want volgens mij heb ik hem op 0 staan..
Hoe kan ik dit script nu op een goede manier draaien?
Ok, ik neem aan dat ik een nieuwe moet maken in een submap anders geldt het voor mijn hele site?
N K op 30/07/2014 20:52:26:
( ong 7 minuten)
Zit dat dan wel goed in elkaar?
In die tijd installeer je bijna een hele server.
Ik voer 127 queries uit op een api. Ik krijg dit niet voor elkaar om in 1 query te doen.
Mede door de beperkingen van de Facebook Graph api.
Duurt dat het grootste gedeelte van de totaal tijd, dan kan je vrij weinig doen.
Is dat niet zo, dan ligt het probleem in je script.
Meer via cli.
Ben je ook meteen van imeout af, want die bestaat dan niet
Edit:
Ik zie trouwens wel wat interessants : https://developers.facebook.com/docs/graph-api/making-multiple-requests/
..Maar hoe ik dit aan de gang krijg.. ;-)
Ik zie trouwens wel wat interessants : https://developers.facebook.com/docs/graph-api/making-multiple-requests/
..Maar hoe ik dit aan de gang krijg.. ;-)
Gewijzigd op 31/07/2014 08:50:39 door N K
Ter vergelijking:
Ik heb een csv import waarbij ik een csv ophaal van ruim 56 Mb.
Vanuit de csv moet ik alles bij elkaar ruim 50.000 records in diverse tabellen inserten.
Daarna nog eens de geimporteerde data met de bestaande data synchroniseren.
Dit alles duurt bij elkaar nog geen minuut.
Maar jij bent sql-god ger. :-) ik zal eens vanavond wat code posten
Vooralsnog heb ik weinig gelovigen ;-)
Goed..Ik heb wat tests gedaan.
Het hele script duurt 5,5 ,minuut.
Om alle responses binnen te krijgen van de API duurt precies 1 minuut.
Dat betekent dat de queries dus 4,5 minuut duren :-(
Nu mijn prachtige code. ugh..
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
<?php
//Haal alle zoektermen t.b.v. api op.
$sql_get_fb_codes = "SELECT * FROM fb_api ORDER BY name";
$result_get_fb_codes = mysqli_query($con,$sql_get_fb_codes);
if ($result_get_fb_codes === false)
{
echo showSQLError($sql_get_fb_codes,mysqli_error($con),'Fout met database.');
}
while( $row = mysqli_fetch_assoc($result_get_fb_codes) ){
$graph_url = '****************';
$data = file_get_contents($graph_url);
$array =(json_decode($data,true));
foreach ($array as $venue)
{
foreach ($venue as $event)
{
//Check op gevulde velden
if(!empty($event["pic_cover"]['source'])
&& (!empty($event["location"]))
&& (!empty($event["venue"]["id"]))
&& (!empty($event["venue"]["latitude"]))
&& (!empty($event["venue"]["longitude"]))
&& (!empty($event["venue"]["city"]))
&& (!empty($event["venue"]["street"]))
&& (!empty($event["venue"]["zip"]))
&& (!empty($event["pic_cover"]['cover_id']))
&& (!empty($event["eid"]))
&& (!empty($event["name"]))
&& (!empty($event["description"]))
&& (!empty($event["start_time"]))
)
{
//check of venue_id al bestaat
$sql_check_venueid = 'SELECT venue_id FROM venue where fb_venue_id = "'.mysqli_real_escape_string($con, $event["venue"]["id"]).'"';
$result_check_venueid = mysqli_query($con,$sql_check_venueid);
if ($result_check_venueid === false){
echo showSQLError($sql_check_venueid,mysqli_error($con),'Fout met database.');
}
$num_rows = mysqli_num_rows($result_check_venueid);
if($num_rows == 0){
//Insert venue in database als venue niet bestaat
$sql_insert_venue = '
INSERT INTO
venue
(
user_id,
name,
fb_venue_id,
lat,
lon,
city,
street,
zipcode,
create_date,
change_date
)
VALUES
( "'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, $event["location"]).'",
"'.mysqli_real_escape_string($con, $event["venue"]["id"]).'",
"'.mysqli_real_escape_string($con, $event["venue"]["latitude"]).'",
"'.mysqli_real_escape_string($con, $event["venue"]["longitude"]).'",
"'.mysqli_real_escape_string($con, $city).'",
"'.mysqli_real_escape_string($con, $event["venue"]["street"]).'",
"'.mysqli_real_escape_string($con, $event["venue"]["zip"]).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'")
';
$result = mysqli_query($con,$sql_insert_venue);
if ($result === false){
echo showSQLError($sql_insert_venue,mysqli_error($con),'Fout met database.');
}
//sla venue_id op in mysql variabele voor in query insert event als venue nog niet bestaat.
//Anders pak de bestaande venue_id
$sql_get_last_venueid = 'SELECT MAX(venue_id) FROM venue INTO @venue_id';
$venue_id = '@venue_id';
$result = mysqli_query($con,$sql_get_last_venueid);
if ($result === false){
echo showSQLError($sql_get_last_venueid,mysqli_error($con),'Fout met database.');
}
}
else{
$row = $result_check_venueid->fetch_assoc();
$venue_id = $row['venue_id'];
//Update venue in database als venue wel bestaat
$sql_update_venue = "
UPDATE
venue
SET
user_id = '".mysqli_real_escape_string($con, 1)."',
name = '".mysqli_real_escape_string($con, $event["location"])."',
fb_venue_id = '".mysqli_real_escape_string($con, $event["venue"]["id"])."',
lat = '".mysqli_real_escape_string($con, $event["venue"]["latitude"])."',
lon = '".mysqli_real_escape_string($con, $event["venue"]["longitude"])."',
city = '".mysqli_real_escape_string($con, $city)."',
street = '".mysqli_real_escape_string($con, $event["venue"]["street"])."',
zipcode = '".mysqli_real_escape_string($con, $event["venue"]["zip"])."',
change_date = '".mysqli_real_escape_string($con, date('Y-m-d H:i:s'))."'
WHERE
venue_id = '$venue_id'
";
$result = mysqli_query($con,$sql_update_venue);
if ($result === false){
echo showSQLError($sql_update_venue, mysqli_error($con),'Fout met database.');
}
}
//check of image_id al bestaat
$sql_check_imageid = 'SELECT image_id FROM images where fb_image_id = "'.mysqli_real_escape_string($con, $event["pic_cover"]['cover_id']).'"';
$result_check_imageid = mysqli_query($con,$sql_check_imageid);
if ($result_check_imageid === false){
echo showSQLError($sql_check_imageid,mysqli_error($con),'Fout met database.');
}
$num_rows = mysqli_num_rows($result_check_imageid);
if($num_rows == 0){
//Insert image in database als image niet bestaat.
$sql_insert__image = '
INSERT INTO
images
(
user_id,
image_url,
image_name,
fb_image_id,
create_date,
change_date
)
VALUES
( "'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, $event["pic_cover"]['source']).'",
"'.mysqli_real_escape_string($con, $event["pic_cover"]['cover_id']).'",
"'.mysqli_real_escape_string($con, $event["pic_cover"]['cover_id']).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'")
';
$result = mysqli_query($con,$sql_insert__image);
if ($result === false){
echo showSQLError($sql_insert__image,mysqli_error($con),'Fout met database.');
}
//sla image_id op in mysql variabele voor in query insert event
$sql_get_last_imageid = 'SELECT MAX(image_id) FROM images INTO @image_id';
$image_id = '@image_id';
$result = mysqli_query($con,$sql_get_last_imageid);
if ($result === false){
echo showSQLError($sql_get_last_imageid,mysqli_error($con),'Fout met database.');
}
}
else{
$row = $result_check_imageid->fetch_assoc();
$image_id = $row['image_id'];
//Update image in database als image wel bestaat
$sql_update_image = "
UPDATE
images
SET
user_id = '".mysqli_real_escape_string($con, 1)."',
image_url = '".mysqli_real_escape_string($con, $event["pic_cover"]['source'])."',
image_name = '".mysqli_real_escape_string($con, $event["pic_cover"]['cover_id'])."',
fb_image_id = '".mysqli_real_escape_string($con, $event["pic_cover"]['cover_id'])."',
change_date = '".mysqli_real_escape_string($con, date('Y-m-d H:i:s'))."'
WHERE
image_id = '".$image_id."'
";
$result = mysqli_query($con,$sql_update_venue);
if ($result === false){
echo showSQLError($sql_update_venue, mysqli_error($con),'Fout met database.');
}
}
// format startdate
$timestamp = strtotime($event["start_time"]);
$start_date = date('Y-m-d', $timestamp);
$start_time = date('H:i:s', $timestamp);
//check of event_id al bestaat
$sql_check_eventid = 'SELECT event_id FROM event where fb_event_id = "'.mysqli_real_escape_string($con, $event["eid"]).'"';
$result_check_eventid = mysqli_query($con,$sql_check_eventid);
if ($result_check_eventid === false){
echo showSQLError($sql_check_eventid,mysqli_error($con),'Fout met database.');
}
$num_rows = mysqli_num_rows($result_check_eventid);
if($num_rows == 0){
//Insert event in database als event niet bestaat
$sql_insert__event = '
INSERT INTO
event
(
fb_event_id,
venue_id,
user_id,
image_id,
title,
description,
startdate,
starttime,
create_date,
change_date,
published,
event_status
)
VALUES
(
"'.mysqli_real_escape_string($con, $event["eid"]).'",
'.$venue_id.',
"'.mysqli_real_escape_string($con, 1).'",
'.$image_id.',
"'.mysqli_real_escape_string($con, $event["name"]).'",
"'.mysqli_real_escape_string($con, $event["description"]).'",
"'.mysqli_real_escape_string($con, $start_date).'",
"'.mysqli_real_escape_string($con, $start_time).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, 'n').'")';
$result = mysqli_query($con,$sql_insert__event);
$affected_insert[] = mysqli_affected_rows($con);
if ($result === false){
echo showSQLError($sql_insert__event,mysqli_error($con),'Fout met database.');
}
}
else{
$row = $result_check_eventid->fetch_assoc();
$event_id = $row['event_id'];
//Update event in database als event wel bestaat
$sql_update_event = "
UPDATE
event
SET
fb_event_id = '".mysqli_real_escape_string($con, $event["eid"])."',
venue_id = '.$venue_id.',
user_id = '".mysqli_real_escape_string($con, 1)."',
image_id = '.$image_id.',
title = '".mysqli_real_escape_string($con, $event["name"])."',
description = '".mysqli_real_escape_string($con, $event["description"])."',
ticket_url = '".mysqli_real_escape_string($con, $event["ticket_uri"])."',
startdate = '".mysqli_real_escape_string($con, $start_date)."',
starttime = '".mysqli_real_escape_string($con, $start_time)."',
change_date = '".mysqli_real_escape_string($con, date('Y-m-d H:i:s'))."',
published = '".mysqli_real_escape_string($con, 1)."',
event_status = '".mysqli_real_escape_string($con, 'u')."'
WHERE
event_id = '$event_id'
";
$result = mysqli_query($con,$sql_update_event);
$affected_update[] = mysqli_affected_rows($con);
if ($result === false){
echo showSQLError($sql_update_event, mysqli_error($con),'Fout met database.');
}
}
}
}
}
echo '<tr><td>'.$name.'</td><td>'.count($affected_insert).'</td><td>'.count($affected_update).'</td></tr>';
unset($affected_insert);
unset($affected_update);
}
?>
//Haal alle zoektermen t.b.v. api op.
$sql_get_fb_codes = "SELECT * FROM fb_api ORDER BY name";
$result_get_fb_codes = mysqli_query($con,$sql_get_fb_codes);
if ($result_get_fb_codes === false)
{
echo showSQLError($sql_get_fb_codes,mysqli_error($con),'Fout met database.');
}
while( $row = mysqli_fetch_assoc($result_get_fb_codes) ){
$graph_url = '****************';
$data = file_get_contents($graph_url);
$array =(json_decode($data,true));
foreach ($array as $venue)
{
foreach ($venue as $event)
{
//Check op gevulde velden
if(!empty($event["pic_cover"]['source'])
&& (!empty($event["location"]))
&& (!empty($event["venue"]["id"]))
&& (!empty($event["venue"]["latitude"]))
&& (!empty($event["venue"]["longitude"]))
&& (!empty($event["venue"]["city"]))
&& (!empty($event["venue"]["street"]))
&& (!empty($event["venue"]["zip"]))
&& (!empty($event["pic_cover"]['cover_id']))
&& (!empty($event["eid"]))
&& (!empty($event["name"]))
&& (!empty($event["description"]))
&& (!empty($event["start_time"]))
)
{
//check of venue_id al bestaat
$sql_check_venueid = 'SELECT venue_id FROM venue where fb_venue_id = "'.mysqli_real_escape_string($con, $event["venue"]["id"]).'"';
$result_check_venueid = mysqli_query($con,$sql_check_venueid);
if ($result_check_venueid === false){
echo showSQLError($sql_check_venueid,mysqli_error($con),'Fout met database.');
}
$num_rows = mysqli_num_rows($result_check_venueid);
if($num_rows == 0){
//Insert venue in database als venue niet bestaat
$sql_insert_venue = '
INSERT INTO
venue
(
user_id,
name,
fb_venue_id,
lat,
lon,
city,
street,
zipcode,
create_date,
change_date
)
VALUES
( "'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, $event["location"]).'",
"'.mysqli_real_escape_string($con, $event["venue"]["id"]).'",
"'.mysqli_real_escape_string($con, $event["venue"]["latitude"]).'",
"'.mysqli_real_escape_string($con, $event["venue"]["longitude"]).'",
"'.mysqli_real_escape_string($con, $city).'",
"'.mysqli_real_escape_string($con, $event["venue"]["street"]).'",
"'.mysqli_real_escape_string($con, $event["venue"]["zip"]).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'")
';
$result = mysqli_query($con,$sql_insert_venue);
if ($result === false){
echo showSQLError($sql_insert_venue,mysqli_error($con),'Fout met database.');
}
//sla venue_id op in mysql variabele voor in query insert event als venue nog niet bestaat.
//Anders pak de bestaande venue_id
$sql_get_last_venueid = 'SELECT MAX(venue_id) FROM venue INTO @venue_id';
$venue_id = '@venue_id';
$result = mysqli_query($con,$sql_get_last_venueid);
if ($result === false){
echo showSQLError($sql_get_last_venueid,mysqli_error($con),'Fout met database.');
}
}
else{
$row = $result_check_venueid->fetch_assoc();
$venue_id = $row['venue_id'];
//Update venue in database als venue wel bestaat
$sql_update_venue = "
UPDATE
venue
SET
user_id = '".mysqli_real_escape_string($con, 1)."',
name = '".mysqli_real_escape_string($con, $event["location"])."',
fb_venue_id = '".mysqli_real_escape_string($con, $event["venue"]["id"])."',
lat = '".mysqli_real_escape_string($con, $event["venue"]["latitude"])."',
lon = '".mysqli_real_escape_string($con, $event["venue"]["longitude"])."',
city = '".mysqli_real_escape_string($con, $city)."',
street = '".mysqli_real_escape_string($con, $event["venue"]["street"])."',
zipcode = '".mysqli_real_escape_string($con, $event["venue"]["zip"])."',
change_date = '".mysqli_real_escape_string($con, date('Y-m-d H:i:s'))."'
WHERE
venue_id = '$venue_id'
";
$result = mysqli_query($con,$sql_update_venue);
if ($result === false){
echo showSQLError($sql_update_venue, mysqli_error($con),'Fout met database.');
}
}
//check of image_id al bestaat
$sql_check_imageid = 'SELECT image_id FROM images where fb_image_id = "'.mysqli_real_escape_string($con, $event["pic_cover"]['cover_id']).'"';
$result_check_imageid = mysqli_query($con,$sql_check_imageid);
if ($result_check_imageid === false){
echo showSQLError($sql_check_imageid,mysqli_error($con),'Fout met database.');
}
$num_rows = mysqli_num_rows($result_check_imageid);
if($num_rows == 0){
//Insert image in database als image niet bestaat.
$sql_insert__image = '
INSERT INTO
images
(
user_id,
image_url,
image_name,
fb_image_id,
create_date,
change_date
)
VALUES
( "'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, $event["pic_cover"]['source']).'",
"'.mysqli_real_escape_string($con, $event["pic_cover"]['cover_id']).'",
"'.mysqli_real_escape_string($con, $event["pic_cover"]['cover_id']).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'")
';
$result = mysqli_query($con,$sql_insert__image);
if ($result === false){
echo showSQLError($sql_insert__image,mysqli_error($con),'Fout met database.');
}
//sla image_id op in mysql variabele voor in query insert event
$sql_get_last_imageid = 'SELECT MAX(image_id) FROM images INTO @image_id';
$image_id = '@image_id';
$result = mysqli_query($con,$sql_get_last_imageid);
if ($result === false){
echo showSQLError($sql_get_last_imageid,mysqli_error($con),'Fout met database.');
}
}
else{
$row = $result_check_imageid->fetch_assoc();
$image_id = $row['image_id'];
//Update image in database als image wel bestaat
$sql_update_image = "
UPDATE
images
SET
user_id = '".mysqli_real_escape_string($con, 1)."',
image_url = '".mysqli_real_escape_string($con, $event["pic_cover"]['source'])."',
image_name = '".mysqli_real_escape_string($con, $event["pic_cover"]['cover_id'])."',
fb_image_id = '".mysqli_real_escape_string($con, $event["pic_cover"]['cover_id'])."',
change_date = '".mysqli_real_escape_string($con, date('Y-m-d H:i:s'))."'
WHERE
image_id = '".$image_id."'
";
$result = mysqli_query($con,$sql_update_venue);
if ($result === false){
echo showSQLError($sql_update_venue, mysqli_error($con),'Fout met database.');
}
}
// format startdate
$timestamp = strtotime($event["start_time"]);
$start_date = date('Y-m-d', $timestamp);
$start_time = date('H:i:s', $timestamp);
//check of event_id al bestaat
$sql_check_eventid = 'SELECT event_id FROM event where fb_event_id = "'.mysqli_real_escape_string($con, $event["eid"]).'"';
$result_check_eventid = mysqli_query($con,$sql_check_eventid);
if ($result_check_eventid === false){
echo showSQLError($sql_check_eventid,mysqli_error($con),'Fout met database.');
}
$num_rows = mysqli_num_rows($result_check_eventid);
if($num_rows == 0){
//Insert event in database als event niet bestaat
$sql_insert__event = '
INSERT INTO
event
(
fb_event_id,
venue_id,
user_id,
image_id,
title,
description,
startdate,
starttime,
create_date,
change_date,
published,
event_status
)
VALUES
(
"'.mysqli_real_escape_string($con, $event["eid"]).'",
'.$venue_id.',
"'.mysqli_real_escape_string($con, 1).'",
'.$image_id.',
"'.mysqli_real_escape_string($con, $event["name"]).'",
"'.mysqli_real_escape_string($con, $event["description"]).'",
"'.mysqli_real_escape_string($con, $start_date).'",
"'.mysqli_real_escape_string($con, $start_time).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, 'n').'")';
$result = mysqli_query($con,$sql_insert__event);
$affected_insert[] = mysqli_affected_rows($con);
if ($result === false){
echo showSQLError($sql_insert__event,mysqli_error($con),'Fout met database.');
}
}
else{
$row = $result_check_eventid->fetch_assoc();
$event_id = $row['event_id'];
//Update event in database als event wel bestaat
$sql_update_event = "
UPDATE
event
SET
fb_event_id = '".mysqli_real_escape_string($con, $event["eid"])."',
venue_id = '.$venue_id.',
user_id = '".mysqli_real_escape_string($con, 1)."',
image_id = '.$image_id.',
title = '".mysqli_real_escape_string($con, $event["name"])."',
description = '".mysqli_real_escape_string($con, $event["description"])."',
ticket_url = '".mysqli_real_escape_string($con, $event["ticket_uri"])."',
startdate = '".mysqli_real_escape_string($con, $start_date)."',
starttime = '".mysqli_real_escape_string($con, $start_time)."',
change_date = '".mysqli_real_escape_string($con, date('Y-m-d H:i:s'))."',
published = '".mysqli_real_escape_string($con, 1)."',
event_status = '".mysqli_real_escape_string($con, 'u')."'
WHERE
event_id = '$event_id'
";
$result = mysqli_query($con,$sql_update_event);
$affected_update[] = mysqli_affected_rows($con);
if ($result === false){
echo showSQLError($sql_update_event, mysqli_error($con),'Fout met database.');
}
}
}
}
}
echo '<tr><td>'.$name.'</td><td>'.count($affected_insert).'</td><td>'.count($affected_update).'</td></tr>';
unset($affected_insert);
unset($affected_update);
}
?>
Iets zegt me dat dit makkelijker kan.
Vervolgens kan je meerdere records tegelijk invoeren (kort voorbeeld voor de venues):
Code (php)
1
2
3
4
2
3
4
INSERT INTO venue(fb_venue_id, user_id, ....)
VALUES(1,1,...), (2,1,...), (3,1,...)
ON DUPLICATE KEY UPDATE
user_id = VALUES(user_id), ....
VALUES(1,1,...), (2,1,...), (3,1,...)
ON DUPLICATE KEY UPDATE
user_id = VALUES(user_id), ....
Zo heb je 1 query nodig om alle venues in te voeren of te updaten, waar jij er tig gebruikt (niet alleen de INSERT en UPDATE, ook nog een SELECT voor elk event).
Toevoeging op 31/07/2014 20:53:00:
Overigens vraag ik me ook nog af waarom je nog een eigen venue_id hebt, terwijl het fb_venue_id al uniek is (naar ik aanneem).
Gewijzigd op 31/07/2014 20:46:12 door Erwin H
De facebook venues worden bij mijn eigen (handmatig toegevoegde) venues toegevoegd in dezelfde tabel. De autoincrement (venue_id) in deze tabel is de primary key.
De venue_id wil ik ook in mijn events tabel hebben dus ik kom denk ik toch niet onder de SELECT MAX query uit.
Een bulk insert gaat sowieso niet als je achteraf nog wat wilt doen met de LAST_INSERT_ID
Wat gebeurt er als je een DML (insert/update/delete) query uitvoert:
- er wordt gekeken syntax juist is of de kolom- en/of tabelnamen juist zijn.
- er wordt een foreign key check gedaan (InnoDB)
- de tabel wordt gewijzigd
- de indexen worden opnieuw opgebouwd.
FK checks kan je voorkomen door simpelweg geen FK's te gebruiken.
Het herindexeren kan je voorkomen door transacties te gebruiken of door de tabellen te locken.
Ger van Steenderen op 31/07/2014 21:44:42:
Het probleem van een upsert query is wel als je het id in het vervolg nog nodig hebt niet het juiste id terugkrijgt met LAST_INSERT_ID (dat is het id wat toegekend zou worden als het record niet bestond).
Een bulk insert gaat sowieso niet als je achteraf nog wat wilt doen met de LAST_INSERT_ID
Een bulk insert gaat sowieso niet als je achteraf nog wat wilt doen met de LAST_INSERT_ID
Klopt, kan ook niet bij een multi insert. Echter, in mijn ogen is het nog altijd handiger om tig inserts in 1 query te doen, dan voor elk record twee queries uit te voeren (eerst een SELECT en dan een INSERT of UPDATE).
Daarnaast is er in dit geval al een unieke key (de fb id), die je al hebt voor je een insert doet en die je dus ook helemaal niet op hoeft te vragen en dat je geen LAST_INSERT_ID kunt gebruiken kan in dit geval een non-argument zijn. Dat de TS het niet wil gebruiken is een ander verhaal, ik denk dat voornamelijk met niet de optimale methode kennen te maken heeft. Als je in dit geval wel de fb id gebruikt kan je zonder verdere nadelen een multi insert/update doen.
Toevoeging op 31/07/2014 23:13:56:
P.S. ik wil dat laatste nog even iets beter uitleggen, want nu kan het verkeerd opgevat worden. Wat ik zou voorstellen is buiten de blijkbaar nodige auto increment key, de fb id ook als unieke index gebruiken. Die kan NULL blijven voor de eigen events, maar gevuld voor de fb events. Daardoor kan je het gebruiken voor de insert vs update. Je kan het ook gebruiken om bij volgende queries, waarin het id nodig is, via joins op de fb id het auto increment id op te halen. Dan heb je dus op geen enkel moment de LAST_INSERT_ID functionaliteit nodig en dus kan je het in bulk doen.
Gewijzigd op 31/07/2014 22:45:46 door Erwin H
Als dat ook een (bulk)insert is valt er weinig te joinen, en moet je telkens een subquery gaan uitvoeren om de bijbehorende id op te halen.
Beetje afhankelijk van het aantal queries wat je uitspaart en het aantal subqueries wat je daardoor moet uitvoeren.
Al met al zie ik zo de mogelijkheid om tig plus tig queries te vervangen door 3 queries (insert/update, select en nog een insert/update).
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<?php
//Insert venue in database
$sql_insert_venue = '
INSERT INTO
venue
(
user_id,
name,
fb_venue_id,
lat,
lon,
city,
street,
zipcode,
create_date,
change_date
)
VALUES
( "'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, $event["location"]).'",
"'.mysqli_real_escape_string($con, $fb_venue_id ).'",
"'.mysqli_real_escape_string($con, $latitude).'",
"'.mysqli_real_escape_string($con, $longitude).'",
"'.mysqli_real_escape_string($con, $event["venue"]["city"]).'",
"'.mysqli_real_escape_string($con, $event["venue"]["street"]).'",
"'.mysqli_real_escape_string($con, $zip).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'"
)
ON DUPLICATE KEY UPDATE
user_id = "'.mysqli_real_escape_string($con, 1).'",
name = "'.mysqli_real_escape_string($con, $event["location"]).'",
fb_venue_id = "'.mysqli_real_escape_string($con, $fb_venue_id ).'",
lat = "'.mysqli_real_escape_string($con, $latitude).'",
lon = "'.mysqli_real_escape_string($con, $longitude).'",
city = "'.mysqli_real_escape_string($con, $event["venue"]["city"]).'",
street = "'.mysqli_real_escape_string($con, $event["venue"]["street"]).'",
zipcode = "'.mysqli_real_escape_string($con, $zip).'",
change_date = "'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'"
';
$result = mysqli_query($con,$sql_insert_venue);
if ($result === false){
echo showSQLError($sql_insert_venue,mysqli_error($con),'Fout met database.');
}
//Insert image in database
$sql_insert_image = '
INSERT INTO
images
(
user_id,
image_url,
image_name,
fb_image_id,
create_date,
change_date
)
VALUES
( "'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, $event["pic_cover"]['source']).'",
"'.mysqli_real_escape_string($con, $fb_image_id).'",
"'.mysqli_real_escape_string($con, $fb_image_id).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'")
ON DUPLICATE KEY UPDATE
user_id = "'.mysqli_real_escape_string($con, 1).'",
image_url = "'.mysqli_real_escape_string($con, $event["pic_cover"]['source']).'",
image_name = "'.mysqli_real_escape_string($con, $fb_image_id).'",
fb_image_id = "'.mysqli_real_escape_string($con, $fb_image_id).'",
change_date = "'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'"
';
$result = mysqli_query($con,$sql_insert_image);
if ($result === false){
echo showSQLError($sql_insert_image,mysqli_error($con),'Fout met database.');
}
// format startdate
$timestamp = strtotime($event["start_time"]);
$start_date = date('Y-m-d', $timestamp);
$start_time = date('H:i:s', $timestamp);
//Insert event in database
$sql_insert_event = '
INSERT INTO
event
(
fb_event_id,
user_id,
title,
description,
ticket_url,
startdate,
starttime,
create_date,
change_date,
published,
event_status
)
VALUES
(
"'.mysqli_real_escape_string($con, $eid).'",
"'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, $event["name"]).'",
"'.mysqli_real_escape_string($con, $event["description"]).'",
"'.mysqli_real_escape_string($con, $event["ticket_uri"]).'",
"'.mysqli_real_escape_string($con, $start_date).'",
"'.mysqli_real_escape_string($con, $start_time).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, 'n').'")
ON DUPLICATE KEY UPDATE
fb_event_id = "'.mysqli_real_escape_string($con, $eid).'",
user_id = "'.mysqli_real_escape_string($con, 1).'",
title = "'.mysqli_real_escape_string($con, $event["name"]).'",
description = "'.mysqli_real_escape_string($con, $event["description"]).'",
ticket_url = "'.mysqli_real_escape_string($con, $event["ticket_uri"]).'",
startdate = "'.mysqli_real_escape_string($con, $start_date).'",
starttime = "'.mysqli_real_escape_string($con, $start_time).'",
change_date = "'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
published = "'.mysqli_real_escape_string($con, 1).'",
event_status = "'.mysqli_real_escape_string($con, 'u').'"
';
$result = mysqli_query($con,$sql_insert_event);
if ($result === false){
echo showSQLError($sql_insert_event,mysqli_error($con),'Fout met database.');
}
?>
//Insert venue in database
$sql_insert_venue = '
INSERT INTO
venue
(
user_id,
name,
fb_venue_id,
lat,
lon,
city,
street,
zipcode,
create_date,
change_date
)
VALUES
( "'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, $event["location"]).'",
"'.mysqli_real_escape_string($con, $fb_venue_id ).'",
"'.mysqli_real_escape_string($con, $latitude).'",
"'.mysqli_real_escape_string($con, $longitude).'",
"'.mysqli_real_escape_string($con, $event["venue"]["city"]).'",
"'.mysqli_real_escape_string($con, $event["venue"]["street"]).'",
"'.mysqli_real_escape_string($con, $zip).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'"
)
ON DUPLICATE KEY UPDATE
user_id = "'.mysqli_real_escape_string($con, 1).'",
name = "'.mysqli_real_escape_string($con, $event["location"]).'",
fb_venue_id = "'.mysqli_real_escape_string($con, $fb_venue_id ).'",
lat = "'.mysqli_real_escape_string($con, $latitude).'",
lon = "'.mysqli_real_escape_string($con, $longitude).'",
city = "'.mysqli_real_escape_string($con, $event["venue"]["city"]).'",
street = "'.mysqli_real_escape_string($con, $event["venue"]["street"]).'",
zipcode = "'.mysqli_real_escape_string($con, $zip).'",
change_date = "'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'"
';
$result = mysqli_query($con,$sql_insert_venue);
if ($result === false){
echo showSQLError($sql_insert_venue,mysqli_error($con),'Fout met database.');
}
//Insert image in database
$sql_insert_image = '
INSERT INTO
images
(
user_id,
image_url,
image_name,
fb_image_id,
create_date,
change_date
)
VALUES
( "'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, $event["pic_cover"]['source']).'",
"'.mysqli_real_escape_string($con, $fb_image_id).'",
"'.mysqli_real_escape_string($con, $fb_image_id).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'")
ON DUPLICATE KEY UPDATE
user_id = "'.mysqli_real_escape_string($con, 1).'",
image_url = "'.mysqli_real_escape_string($con, $event["pic_cover"]['source']).'",
image_name = "'.mysqli_real_escape_string($con, $fb_image_id).'",
fb_image_id = "'.mysqli_real_escape_string($con, $fb_image_id).'",
change_date = "'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'"
';
$result = mysqli_query($con,$sql_insert_image);
if ($result === false){
echo showSQLError($sql_insert_image,mysqli_error($con),'Fout met database.');
}
// format startdate
$timestamp = strtotime($event["start_time"]);
$start_date = date('Y-m-d', $timestamp);
$start_time = date('H:i:s', $timestamp);
//Insert event in database
$sql_insert_event = '
INSERT INTO
event
(
fb_event_id,
user_id,
title,
description,
ticket_url,
startdate,
starttime,
create_date,
change_date,
published,
event_status
)
VALUES
(
"'.mysqli_real_escape_string($con, $eid).'",
"'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, $event["name"]).'",
"'.mysqli_real_escape_string($con, $event["description"]).'",
"'.mysqli_real_escape_string($con, $event["ticket_uri"]).'",
"'.mysqli_real_escape_string($con, $start_date).'",
"'.mysqli_real_escape_string($con, $start_time).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
"'.mysqli_real_escape_string($con, 1).'",
"'.mysqli_real_escape_string($con, 'n').'")
ON DUPLICATE KEY UPDATE
fb_event_id = "'.mysqli_real_escape_string($con, $eid).'",
user_id = "'.mysqli_real_escape_string($con, 1).'",
title = "'.mysqli_real_escape_string($con, $event["name"]).'",
description = "'.mysqli_real_escape_string($con, $event["description"]).'",
ticket_url = "'.mysqli_real_escape_string($con, $event["ticket_uri"]).'",
startdate = "'.mysqli_real_escape_string($con, $start_date).'",
starttime = "'.mysqli_real_escape_string($con, $start_time).'",
change_date = "'.mysqli_real_escape_string($con, date('Y-m-d H:i:s')).'",
published = "'.mysqli_real_escape_string($con, 1).'",
event_status = "'.mysqli_real_escape_string($con, 'u').'"
';
$result = mysqli_query($con,$sql_insert_event);
if ($result === false){
echo showSQLError($sql_insert_event,mysqli_error($con),'Fout met database.');
}
?>
Hoe krijg ik nu de venue_id (auto increment van de venue tabel) en de image_id(auto increment van de image tabel) in de event tabel?
Toevoeging op 02/08/2014 09:19:46:
ah, ik zal waarschijnlijk de fb_image_id en de fb_venue_id ook in de eventtabel moeten opslaan...
Wat ook niet onbelangrijk is. Ik maak voor elk json object nu 3 queries.(nu 168 in totaal) Als ik alle json objecten kan samenvoegen hoef ik dit maar 1x te doen. Ik denk dat daar de meeste tijdwinst in zit.
Gewijzigd op 02/08/2014 09:32:22 door N K