Im Using PHP curl for saving website name page name on which user has just clicked and ip address in my database, but the problem curl send 2 requests automatically one with correct data and in other one just changed the page name to index.php, i want to abort the second request just, means when curl executes one time then no request by curl untill an other click on the same page, hope my discription will help you to find out my error for me, here is my code.
**This IS My Curl Code**
$wb_nm = $_SERVER[HTTP_HOST];
$pg_nm = $_SERVER[PHP_SELF];
$usr_ip = $_SERVER[REMOTE_ADDR];
$pg_nm_ultr = trim($pg_nm , '/');
$n_url = "localhost/curl/new_page.php";
$data = array(
"varhost" => $wb_nm,
"varpage" => $pg_nm_ultr,
"varip" => $usr_ip
);
$post = curl_init();
curl_setopt($post, CURLOPT_URL, $n_url);
curl_setopt($post, CURLOPT_POSTFIELDS, $data);
curl_setopt($post, CURLOPT_RETURNTRANSFER, false);
$result = curl_exec($post);
curl_close($post);
?>
**And This Is new_page.php**
if(isset($_POST['varhost']) && isset($_POST['varpage']) && isset($_POST['varip']))
{
$web_name = $_POST['varhost'];
$page_name_ulter = $_POST['varpage'];
$user_ip = $_POST['varip'];
define("DB_HOSTNAME", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_DB", "pan");
$connection = mysqli_connect(DB_HOSTNAME, DB_USER, DB_PASS, DB_DB);
if(isset($connection)){
$query = "SELECT * FROM tbl_agencies WHERE weblink = '".$web_name."'";
$result = mysqli_query($connection , $query);
if($result){
while($row = mysqli_fetch_array($result)){
if(isset($row))
{
$D_id = $row['domain_id'];
$D_name = $row['website'];
if($D_id == 0)
{
return false;
}
}
else
{
}
break;
}
}
}
$date_date = date('Y-m-d');
$time_stamp = date("H:i:s");
$query_Code = "INSERT INTO user_details (website_domain_id , website_domain_name , page_clicked , user_IP , access_date , access_time) VALUES ('".$D_id."','".$D_name."' , '".$page_name_ulter."' , '".$user_ip."' , '".$date_date."' , '".$time_stamp."')";
$result_Code = mysqli_query($connection , $query_Code);
if($result_Code)
{
mysqli_close($connection);
}
}
?>
In curl_setopt($post, CURLOPT_POSTFIELDS, $fields);, you can send fields as an associative array. So this code:
$fields = '';
foreach($data as $key => $value) {
$fields .= $key . '=' . $value . '&';
}
rtrim($fields, '&');
is actually not needed such that curl_setopt($post, CURLOPT_POSTFIELDS, $fields); becomes
curl_setopt($post, CURLOPT_POSTFIELDS, $data);
Related
I want to insert single data into SQL. I have instert table and first and lastname I will post data to service.php using implode and in service I will exlope data and add into a database. But it doesn't work.
Here is my inser.php page
if($_POST)
{
$first_name = ($_POST['first_name']);
$last_name = ($_POST['last_name']);
$query=$first_name.'|'.$last_name;
$params=array(
'action' => "INSERTSINGLE",
'query' => $query
);
$postData='';
foreach($params as $k => $v){
$postData .= $k . '='.$v.'&';
}
rtrim($postData, '&');
if(is_array($postData)){
$count=count($postData);
}else{
$count=0;
}
print_r($postData);
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL,"service.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_HEADER,false);
curl_setopt($ch, CURLOPT_POST,$count);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:
application/json'));
$responsedata=curl_exec($ch);
curl_close($ch);
print_r($responsedata);
}
and here is my webservice page
require_once('index.php');
$action=$_POST["action"];
echo $action;
$query = $_POST["query"];
$gelendata=explode('|',$query);
$firstname=$gelendata[0];
$lastname=$gelendata[1];
switch ($action)
{
case 'GETCLIENTS':
echo $firstname;
$query = $myPDO->query("SELECT * FROM users",PDO::FETCH_ASSOC);
foreach ($query as $row) {
echo $row['first_name']."-".$row['last_name']."<br />\n";
}
break;
case 'GETCLIENT':
echo 'client çekildi.';
$query = $myPDO->query("SELECT * FROM users WHERE user_id='{$query}'")->fetch(PDO::FETCH_ASSOC);
print_r($query);
break;
case 'INSERTSINGLE':
echo 'client çekildi.';
$query = $myPDO->query("INSERT INTO users (firs_name,last_name) VALUES({$firstname},{$lastname})")->fetch(PDO::FETCH_ASSOC);
print_r($query);
break;
I can take the data but I can not insert. Can you please forward me? Thanks...
case 'INSERTSINGLE':
echo 'client çekildi.';
$query = $myPDO->query("INSERT INTO users (firs_name,last_name) VALUES('{$firstname}','{$lastname}')")->fetch(PDO::FETCH_ASSOC);
print_r($query);
break;
I am posting data to a URL to send a Thank You Message. The details am picking are from a table called readtextfilejson. From where I am sending Thank you messages to users.
I am however not able to select details of the only users who haven't received their text message. My code is selecting all the data and posting to all the users again and again in a loop. Thus sending multiple ThankYouMessages to users.
I have added a new column called ThankyouMessage that is by default = 'not sent'.
So that when my script runs, it updates the ThankYouMessage column to = 'SENT', so that my script can Only select details of users who haven't yet received their thankyoumessage.
Thus i don't keep re-sending the same message again and again. Kindly take a look at my script below and assist how i might resolve this.
My table structure:
<?php
$data = (string) file_get_contents($file);
//echo $data;
$data = str_replace('//Confirmation Respose', '', $data);
$data = str_replace('// Validation Response', '', $data);
$data = str_replace(' ', '', $data);
$data = preg_replace('/\s+/S', " ", $data);
$data = trim($data);
$pattern = '/\s*/m';
$replace = '';
$testString = $data;
$removedWhitespace = preg_replace( $pattern, $replace,$testString );
$removedWhitespace2 = str_replace (' ', '', $testString);
$getAllData = explode('}{', $removedWhitespace2);
foreach ($getAllData as $row) {
$row = str_replace('{', '', $row);
$rowData = explode(',"', $row);
$rowData = explode(',"', $row);
$columnValues = array();
$chkTransId = '';
foreach ($rowData as $value) {
$newVal = explode(':', $value);
$key = str_replace('"', '', $newVal[0]);
$val = str_replace('"', '', $newVal[1]);
$val = trim($val);
$columnValues[] = ($val) ? "'$val'": "''";
if($key == 'TransID'){
$chkTransId = $val;
}
}
if($chkTransId == ''){
continue;
}
////THIS IS THE SECTION AM HAVING PROBLEMS WITH - I WANT TO
////SELECT ONLY THE DATA WHERE THE COLUMN WHERE thankyoumessage =
///// 'NOT SENT'
$chkSql = "select * from `readtextfilejson`where TransID='$chkTransId'";
$getResult = mysqli_query($con, $chkSql);
$getCount = mysqli_num_rows($getResult);
$row = mysqli_fetch_object($getResult);
$text = "Dear ". $row->FirstName ." Your Payment of ". $row->TransAmount ." to XXXXX was Received Succesfully. Confirmation Code: ". $row->TransID ."";
$destination = array("messageId"=>"$product_id","to"=>"$row->MSISDN");
$product_id=uniqid();
$notifyUrl = "URL";
$notifyContentType = "application/json";
$callbackData = 'eHostOnlineCodeCheck125690';
$username = "USERNAME";
$password = "PASSWORD";
$postUrl = "POSTURL";
$message = array("from" => "USERNAME",
"destinations" => $destination,
"text" => $text,
"bulkId" => "",
"notifyUrl" => $notifyUrl,
"flash" => "false",
"notifyContentType" => $notifyContentType,
"callbackData" => $callbackData);
$postData = array("messages" => array($message));
$postDataJson = json_encode($postData);
//Submit all data to SMS server
$ch = curl_init();
$header = array("Content-Type:application/json", "Accept:application/json");
curl_setopt($ch, CURLOPT_URL, $postUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postDataJson);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// response of the POST request
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$responseBody = json_decode($response);
curl_close($ch);
echo "<pre>";
print_r($row);
print_r($responseBody);
echo "</pre>";
$Sql = "UPDATE readtextfilejson SET thankyoumessage = 'SENT' WHERE thankyoumessage = 'not sent'";
mysqli_query($con, $Sql) or die(mysqli_error($con));
if($getCount > 0){
continue;
}
$columnValues = implode(',', $columnValues);
$sql = "INSERT INTO `readtextfilejson`(`TransactionType`, `TransID`, `TransTime`, `TransAmount`, `BusinessShortCode`, `BillRefNumber`, `InvoiceNumber`, `OrgAccountBalance`, `ThirdPartyTransID`, `MSISDN`, `FirstName`, `MiddleName`, `LastName`) VALUES (".$columnValues.")";
mysqli_query($con, $sql) or die(mysqli_error($con));
}
echo 'Data inserted successfully';
?>
2 possible issues.
1) You are selecting the transaction regardless of what thankyoumessage is set to. You may need to add a condition to that first SQL's where clause
SELECT * FROM `readtextfilejson`
WHERE TransID = '$chkTransId' AND thankyoumessage = 'not sent'
2) When you update the transaction thankyoumessage to "SENT" you are setting all transactions, because your update statement is missing the transaction id. You may need to add it.
UPDATE readtextfilejson
SET thankyoumessage = 'SENT'
WHERE thankyoumessage = 'not sent' AND TransID = '$chkTransId'
And since you want to set it to SENT regardless of what it was before, you may not need the thankyoumessage check either.
UPDATE readtextfilejson
SET thankyoumessage = 'SENT'
WHERE TransID = '$chkTransId'
Have tried to extend the execution time by these methods but the script keeps ending prematurely. It is basically cycling through a mysql database and doing something with each row. It should be lasting maybe five to ten minutes but stops consistently early at the same spot. I have tried the following:
set_time_limit(0);
curl_setopt($ch, CURLOPT_TIMEOUT, 2000000);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 200000);
None of them are working. Please help!
<?php
ini_set('max_execution_time', 500);
$user="5aabf73bdd2c7";
//$user = $_POST['user'];
$servername = "localhost";
$username = "placeprint_1";
$password = "JS313833";
$dbname = "placeprint_1";
// Create connection
$con = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($con->connect_error) {
die("Connection failed: " . $con->connect_error);
}
function file_get_contents_curl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 2000000);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 200000);
curl_setopt($ch,CURLOPT_BINARYTRANSFER, true);
$data = curl_exec($ch);
curl_close ( $ch );
return $data;
}
$sql = "SELECT link, id, cookie FROM rawlinks WHERE cookie='$user' ORDER by ID desc ";
$result = $con->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$getimagefrom=$row["link"];
$id=$row["id"];
$cookie=$row["cookie"];
echo $getimagefrom;
echo "<br><br>ID:".$id."<br><br>";
$htmlaa = file_get_contents_curl($getimagefrom);
$docaa = new DOMDocument();
#$docaa->loadHTML($htmlaa);
$nodesaa = $docaa->getElementsByTagName('title');
$nodesxaa = $docaa->getElementsByTagName('img');
//get and display what you need:
$titlev = $nodesaa->item(0)->nodeValue;
$metasv = $docaa->getElementsByTagName('meta');
$asv = $docaa->getElementsByTagName('img');
for ($iv = 0; $iv < $metasv->length; $iv++)
{
$metav = $metasv->item($iv);
if($metav->getAttribute('name') == 'description')
$descriptionv = $metav->getAttribute('content');
if($metav->getAttribute('name') == 'keywords')
$keywordsv = $metav->getAttribute('content');
if($metav->getAttribute('property') == 'og:image');
$languagev = $metav->getAttribute('content');
}
for ($ivv = 0; $ivv < $asv->length; $ivv++)
{
$av = $asv->item($ivv);
echo $av->getAttribute('src');
echo "<br>";
$cvarv = $av->getAttribute('src');
echo " <img src='$cvarv' >";
$servername = "localhost";
$username = "placeprint_1";
$password = "JS313833";
$dbname = "placeprint_1";
// Create connection
$con = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($con->connect_error) {
die("Connection failed: " . $con->connect_error);
}
$getimagefrom = rtrim($getimagefrom, '/');
$cvarv = urlencode($cvarv);
$titlev = preg_replace('/[^\p{L}\p{N}\s]/u', '', $titlev);
$descriptionv = preg_replace('/[^\p{L}\p{N}\s]/u', '', $descriptionv);
}
}
}
$con->close();
echo "FINISHED!!!!";
?>
From php.ini try to increase the max_execution_time and restart apache server.
To locate where your php.ini is you can create a phpinfo.php file and insert the following:
<?php phpinfo();
More informarion here: https://mediatemple.net/community/products/dv/204643880/how-can-i-create-a-phpinfo.php-page
You can then get the location of the php.ini configuration file location when you visit the phpinfo.php on your browser.
From the code I can suggest that instead of doing an INSERT mysql request for every loop, you should prepare the insert values in the loop and then perform the actual mysql request only once after the loop is finished.
Another suggestion is to have curl_close ( $ch ); before the return in file_get_contents_curl()
I have updated your code in order to be able to work in chunks instead of doing all the execution at once. I have created a table import_progress where we will store the last imported/executed row and fetch 20 rows for every execution:
/**
* Get the last imported ID
*
* #param mysqli $con
*
* #return int
*/
function get_last_inserted_id( $con ) {
$sql = "SELECT imported_id
FROM import_progress
ORDER by ID desc
LIMIT 1";
$result = $con->query( $sql );
if ( $result->num_rows == 0 ) {
//Since you are fetching in descending order
//We need to return a very high number if we did not import anything yet
return 999999999999999999;
} else {
while ( $row = $result->fetch_assoc() ) {
return $row['imported_id'];
}
}
}
/**
* Get the last imported ID
*
* #param mysqli $con
* #param array $ids
*
* #return int
*/
function insert_imported_ids( $con, $ids ) {
$ids = array_unique( array_filter( $ids ) );
if ( empty( $ids ) ) {
return false;
}
$sql = "INSERT INTO import_progress (imported_id) VALUES";
//We now append the data to the mysql string
$insert = [];
foreach ( $ids as $id ) {
$insert[] = "($id)";
}
$sql .= implode( ',', $insert ) . ';';
return $con->query( $sql );
}
/**
* #param string $url
*
* #return mixed
*/
function file_get_contents_curl( $url ) {
$ch = curl_init();
curl_setopt( $ch, CURLOPT_HEADER, 0 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_TIMEOUT, 2000000 );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 200000 );
curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true );
$data = curl_exec( $ch );
curl_close( $ch );
return $data;
}
$user = "5aabf73bdd2c7";
$servername = "db";
$username = "root";
$password = "root";
$dbname = "stack_overflow";
// Create connection
$con = new mysqli( $servername, $username, $password, $dbname );
// Check connection
if ( $con->connect_error ) {
die( "Connection failed: " . $con->connect_error );
}
$last_inserted_id = get_last_inserted_id( $con );
$sql = "SELECT link, id, cookie FROM rawlinks
WHERE cookie='$user'
AND ID < $last_inserted_id
ORDER by ID desc
LIMIT 20";
$result = $con->query( $sql );
if ( $result->num_rows > 0 ) {
$imported_ids = [];
// output data of each row
while ( $row = $result->fetch_assoc() ) {
$getimagefrom = $row["link"];
$id = $row["id"];
$cookie = $row["cookie"];
echo $getimagefrom;
echo "<br><br>ID:" . $id . "<br><br>";
$htmlaa = file_get_contents_curl( $getimagefrom );
$docaa = new DOMDocument();
#$docaa->loadHTML( $htmlaa );
$nodesaa = $docaa->getElementsByTagName( 'title' );
$nodesxaa = $docaa->getElementsByTagName( 'img' );
//get and display what you need:
$titlev = $nodesaa->item( 0 )->nodeValue;
$metasv = $docaa->getElementsByTagName( 'meta' );
$asv = $docaa->getElementsByTagName( 'img' );
for ( $iv = 0; $iv < $metasv->length; $iv ++ ) {
$metav = $metasv->item( $iv );
if ( $metav->getAttribute( 'name' ) == 'description' ) {
$descriptionv = $metav->getAttribute( 'content' );
}
if ( $metav->getAttribute( 'name' ) == 'keywords' ) {
$keywordsv = $metav->getAttribute( 'content' );
}
if ( $metav->getAttribute( 'property' ) == 'og:image' ) {
;
}
$languagev = $metav->getAttribute( 'content' );
}
for ( $ivv = 0; $ivv < $asv->length; $ivv ++ ) {
$av = $asv->item( $ivv );
echo $av->getAttribute( 'src' );
echo "<br>";
$cvarv = $av->getAttribute( 'src' );
echo " <img src='$cvarv' >";
$cvarv = urlencode( $cvarv );
$titlev = preg_replace( '/[^\p{L}\p{N}\s]/u', '', $titlev );
$descriptionv = preg_replace( '/[^\p{L}\p{N}\s]/u', '', $descriptionv );
}
$imported_ids[] = (int)$id;
}
insert_imported_ids($con, $imported_ids);
}
$con->close();
echo "FINISHED!!!!";
Curl doesn't make any difference. If set_time_limit doesn't work it means that a global configuration overrides it, try printing the following:
var_dump(ini_get('max_execution_time'));
One time before executing set_time_limit(0); and also after you've done it.
This could be editable by php.ini but also is typically a blocked feature in free or shared hosting providers to prevent users to over-load the shared server.
add
ini_set('max_execution_time', 500);
at the top of the page, here 500 is number of seconds.
I want to know how to explode or split xml and turn into array and then insert it to database. Because i have an api that need to hit every day and it return xml.
here's my xml sample:
<ArrayOfUnitPrice>
<UnitPrice>
<PriceAmount>1579.7080</PriceAmount>
<PriceDate>2016-09-02</PriceDate>
<PriceType>XWZ</PriceType>
</UnitPrice>
<UnitPrice>
<PriceAmount>1028.4137</PriceAmount>
<PriceDate>2016-09-02</PriceDate>
<PriceType>ABC</PriceType>
</UnitPrice>
...
</ArrayOfUnitPrice>
I'm using this code to extract the xml response:
$ch = curl_init("111.222.333.444:8080/code.asmx/Price");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
$result=curl_exec ($ch);
//my code here
curl_close($ch);
SOLVED
I already done solve my code by using this code below guys.
$xml = simplexml_load_string($result);
for ($i=0; $i < count($xml) ; $i++) {
$arr[] = array (
'PriceAmount' => $xml->UnitPrice[$i]->PriceAmount,
'PriceDate' => $xml->UnitPrice[$i]->PriceDate,
'PriceType' => $xml->UnitPrice[$i]->PriceType
);
}
$data = json_decode(json_encode($arr), true);
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "dailywork";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if(is_array($data)){
$check = "SELECT * FROM table_unit";
if($conn->query($check)->num_rows > 0){
// my stuff to here :-D
}else{
/*Insert data to DB*/
$sql = "INSERT INTO table_unit (PriceAmount, PriceDate, PriceType) values ";
$valuesArr = array();
foreach($data as $row){
$PriceAmount = $row[PriceAmount][0];
$PriceDate = $row[PriceDate][0];
$PriceType = $row[PriceType][0];
$valuesArr[] = "('$PriceAmount', '$PriceDate', '$PriceType')";
}
$sql .= implode(',', $valuesArr);
if ($conn->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
/*End Insert data to DB*/
}
}
$conn->close();
This function will give you an array of your xml
function xml2php($xmlcontent)
{
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $xmlcontent, $arr_vals);
xml_parser_free($xml_parser);
return $arr_vals;
}
pass your $result like this and check it
xml2php($result);
let me know if it helps you
Gcm message not sent to more that 1000 users , gcm has its own limit of sending message to 1000 users so the idea is to divide the users in batch of 1000 each i tried that but the gcm message is received by first 1000 users only how can we send the message in batches of 1000 each, in a total of say 5000 users, so that all users get the message i am new to php please explain the working
<?php
require 'connect.php';
function sendPushNotification($registration_ids, $message) {
$url = 'https://android.googleapis.com/gcm/send';
$fields = array(
'registration_ids' => $registration_ids,
'data' => $message,
);
define('GOOGLE_API_KEY', 'xxxxxxxxxxxxxxxxxxxxxxxxx');
$headers = array(
'Authorization:key=' . GOOGLE_API_KEY,
'Content-Type: application/json'
);
//echo json_encode($fields);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
if($result === false)
die('Curl failed ' . curl_error());
curl_close($ch);
return $result;
}
$pushStatus = '';
function getGCMCount(){
$total = "";
$query = "SELECT count(gcm_regId) as total FROM gcm_users";
while($query_row = mysql_fetch_assoc($query_run)) {
$total = $query_row['total'] / 1000;
}
return $total;
}
if(!empty($_GET['push'])) {
$query = "SELECT gcm_regId FROM gcm_users";
if($query_run = mysql_query($query)) {
$gcmRegIds = array();
$i = 0;
while($query_row = mysql_fetch_assoc($query_run)) {
$i++;
$gcmRegIds[floor($i/1000)][] = $query_row['gcm_regId'];
//echo $i . "</br>" ;
}
}
$pushMessage = $_POST['message'];
if(isset($gcmRegIds) && isset($pushMessage)) {
$pushStatus = array();
//echo "</br> counnt of messages send is". count($pushStatus);
foreach($gcmRegIds as $key=>$val)
{
$message = array('price' => $pushMessage);
//$message1 = array($key=>$val);
//$c = (array_merge($message ,$message1 ));
$pushStatus[] = sendPushNotification($val, $message);
//echo $key;
}
}
}
?>
<html>
<head>
<title>Google Cloud Messaging (GCM) Server in PHP</title>
</head>
<body>
<h1>Google Cloud Messaging (GCM) Server in PHP</h1>
<form method = 'POST' action = 'send_all.php/?push=1'>
<div>
<textarea rows = 2 name = "message" cols = 23 placeholder = 'Messages to Transmit via GCM'></textarea>
</div>
<div>
<input type = 'submit' value = 'Send Push Notification via GCM'>
</div>
<p><h3><?php //echo $pushStatus . "<br>"?></h3></p>
</form>
</body>
</html>
Refer this snippet for sending messages to more than 1000 users
<?php
//Sample for sending notification to more than 1000 users
$mPushNotification = $push->getMessage();
$stmt = $this->con->prepare("SELECT gcm_regid FROM gcm_users");
$stmt->execute();
$result = $stmt->get_result();
$tokens = array();
while ($token = $result->fetch_assoc()) {
array_push($tokens, $token['gcm_regid']);
}
$firebase = new Firebase();
$total = count($tokens);
$groups = ceil($total/800);
$currentval=ceil($total/$groups);
$firebase = new Firebase();
for ($i=0; $i <$groups; $i++) {
$val=($i*$currentval)+1;
$total = ($i+1)*$currentval;
$resToken = getSpecificToken($val,$total);
$result1 = $firebase->send($resToken, $mPushNotification);
}
function getSpecificToken($upper,$lower)
{
$stmt = $this->con->prepare("SELECT * FROM gcm_users LIMIT $upper,$lower");
$stmt->execute();
$result = $stmt->get_result();
$tokens = array();
while ($token = $result->fetch_assoc()) {
array_push($tokens, $token['gcm_regid']);
}
return $tokens;
}
function getMessage() {
$res = array();
$res['data']['id'] = 1;
$res['data']['title'] = "TestTitle";
$res['data']['message'] = "TestMessage : Hello";
return $res;
}
?>
//Firebase File
<?php
class Firebase {
public function send($registration_ids, $message) {
$fields = array(
'registration_ids' => $registration_ids,
'data' => $message,
);
return $this->sendPushNotification($fields);
}
/*
* This function will make the actual curl request to firebase server
* and then the message is sent
*/
private function sendPushNotification($fields) {
//importing the constant files
require_once 'Config.php';
//firebase server url to send the curl request
$url = 'https://fcm.googleapis.com/fcm/send';
//building headers for the request
$headers = array(
'Authorization: key=' . FIREBASE_API_KEY,
'Content-Type: application/json'
);
//Initializing curl to open a connection
$ch = curl_init();
//Setting the curl url
curl_setopt($ch, CURLOPT_URL, $url);
//setting the method as post
curl_setopt($ch, CURLOPT_POST, true);
//adding headers
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//disabling ssl support
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//adding the fields in json format
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
//finally executing the curl request
$result = curl_exec($ch);
if ($result === FALSE) {
die('Curl failed: ' . curl_error($ch));
}
//Now close the connection
curl_close($ch);
//and return the result
return $result;
}
}
?>