The intent of this PHP is to loop through an array returned by an API call and insert the resulting rows into a mySQL table. The array is declared as $data.
The example array provided has two call records [0] and [1] however it can return no call records and many call records depending on caller volume:
Array (
[call] => Array (
[0] => Array (
[hostname] => host.domain.net
[session_id] => 20221001155343061364
[orig_callid] => 0gip97admc1f6s4vbaok
[orig_match] => sip:user@domain.com
[orig_user] => 2001
[orig_domain] => domain.com
[orig_uri] => sip:tel@domain.com
[orig_name] => Peake
[ani] => tel
[dnis] => tel
[by_action] => Array ( )
[by_user] => Array ( )
[by_domain] => Array ( )
[by_callid] => Array ( )
[term_callid] => 20221001155343061365-f1ce8fd3cd1efdb3750535b87e7b7b79
[term_user] => Array ( )
[term_domain] => *
[term_uri] => sip:12028410090@host
[time_begin] => 2022-10-01 15:53:43
[time_answer] => 0000-00-00 00:00:00
[orig_call_info] => progressing
[term_call_info] => alerting
[media] => G.711 u-law
)
[1] => Array (
[hostname] => host.domain.net
[session_id] => 20221001155348027249
[orig_callid] => 2311si08u8u8m5udenak
[orig_match] => sip:user@domain.com
[orig_user] => 2001
[orig_domain] => domain.com
[orig_uri] => sip:tel@domain.com
[orig_name] => Peake
[ani] => tel
[dnis] => tel
[by_action] => Array ( )
[by_user] => Array ( )
[by_domain] => Array ( )
[by_callid] => Array ( )
[term_callid] => 20221001155348027250-f1ce8fd3cd1efdb3750535b87e7b7b79
[term_user] => Array ( )
[term_domain] => *
[term_uri] => sip:tel@host
[time_begin] => 2022-10-01 15:53:48
[time_answer] => 2022-10-01 15:53:50
[orig_call_info] => active
[term_call_info] => active
[media] => PCMU
)
)
)
Here is my PHP:
<?php
foreach($data as $i => $item) {
$link = mysqli_connect("127.0.0.1", "db", "password", "table");
$sql = "INSERT INTO ns_cdr (session_id,orig_user, dnis, ani, time_begin)
VALUES ('".$data[$i]['session_id']."',
'".$data[$i]['orig_match']."',
'".$data[$i]['dnis']."',
'".$data[$i]['ani']."',
'".$data[$i]['time_begin']."')
ON DUPLICATE KEY UPDATE
orig_user = '".$data[$i]['orig_match']."',
dnis = '".$data[$i]['dnis']."',
ani = '".$data[$i]['ani']."',
time_begin='".$data[$i]['time_begin']."'
";
if(mysqli_query($link, $sql)){
echo "";
} else{
echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}
//}
}
?>
This is the result:
Notice: Undefined index: session_id in /var/www/html/tool_getcalls.php on line 50
Notice: Undefined index: orig_match in /var/www/html/tool_getcalls.php on line 51
Notice: Undefined index: dnis in /var/www/html/tool_getcalls.php on line 52
Notice: Undefined index: ani in /var/www/html/tool_getcalls.php on line 53
Notice: Undefined index: time_begin in /var/www/html/tool_getcalls.php on line 54
Notice: Undefined index: orig_match in /var/www/html/tool_getcalls.php on line 56
Notice: Undefined index: dnis in /var/www/html/tool_getcalls.php on line 57
Notice: Undefined index: ani in /var/www/html/tool_getcalls.php on line 58
Notice: Undefined index: time_begin in /var/www/html/tool_getcalls.php on line 59
Just not sure how to handle the loop correctly to parse the array contents. Any help is appreciated!
--------
$SRCDATA
--------
Array (
[call] => Array (
[0] => Array (
[hostname] => host.domain.net
[session_id] => 20221001155343061364
[orig_callid] => 0gip97admc1f6s4vbaok
[orig_match] => sip:user@domain.com
[orig_user] => 2001
[orig_domain] => domain.com
[orig_uri] => sip:tel@domain.com
[orig_name] => Peake
[ani] => tel
[dnis] => tel
[by_action] => Array ( )
[by_user] => Array ( )
[by_domain] => Array ( )
[by_callid] => Array ( )
[term_callid] => 20221001155343061365-f1ce8fd3cd1efdb3750535b87e7b7b79
[term_user] => Array ( )
[term_domain] => *
[term_uri] => sip:12028410090@host
[time_begin] => 2022-10-01 15:53:43
[time_answer] => 0000-00-00 00:00:00
[orig_call_info] => progressing
[term_call_info] => alerting
[media] => G.711 u-law
)
[1] => Array (
[hostname] => host.domain.net
[session_id] => 20221001155348027249
[orig_callid] => 2311si08u8u8m5udenak
[orig_match] => sip:user@domain.com
[orig_user] => 2001
[orig_domain] => domain.com
[orig_uri] => sip:tel@domain.com
[orig_name] => Peake
[ani] => tel
[dnis] => tel
[by_action] => Array ( )
[by_user] => Array ( )
[by_domain] => Array ( )
[by_callid] => Array ( )
[term_callid] => 20221001155348027250-f1ce8fd3cd1efdb3750535b87e7b7b79
[term_user] => Array ( )
[term_domain] => *
[term_uri] => sip:tel@host
[time_begin] => 2022-10-01 15:53:48
[time_answer] => 2022-10-01 15:53:50
[orig_call_info] => active
[term_call_info] => active
[media] => PCMU
)
)
)
And to process the api response using a prepared statement
/* craft the sql with placeholders */
$sql='insert into `ns_cdr` ( `session_id`, `orig_user`, `dnis`, `ani`, `time_begin` )
values ( ?, ?, ?, ?, ? )
on duplicate key update
`orig_user`=?,
`dnis`=?,
`ani`=?,
`time_begin`=?';
/*
create the prepared statement and bind the placeholders to variables.
These variables do not need to exist at this stage when using mysqli
but with PDO this is not the case.
*/
$stmt=$link->prepare( $sql );
$stmt->bind_param( 'sssssssss', $sid, $usr, $dnis, $ani, $begin, $usr, $dnis, $ani, $begin );
/*
$SRCDATA represents the response from the api. The top-level of this
array is keyed under `call` so you need to process under that key.
*/
$data=$SRCDATA['call'];
/*
loop through the data array and, for simplicity, cast the
child arrays as objects to allow use of arrow notation.
*/
foreach( $data as $index => $item ){
$obj=(object)$item;
$sid=$obj->session_id;
$usr=$obj->orig_match;
$dnis=$obj->dnis;
$ani=$obj->ani;
$begin=$obj->time_begin;
# commit the data to the db
$stmt->execute();
}
$stmt->close();
$link->close();
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.