【问题标题】:Need help with a LOOP statement in a php curl function embedded with XML在嵌入 XML 的 php curl 函数中需要 LOOP 语句的帮助
【发布时间】:2011-03-29 05:51:40
【问题描述】:

我有一个 php curl 脚本,我的 sms 网关提供了一个 php curl 脚本,可以让我通过 xml 发送短信。原始脚本是我下面的脚本。

/////////////////////////来自网关的原始php curl xml代码

<?php  


$user="smsgateway_user";
$pass="smsgateway_password";
$sender= "sendername";
$mobileno="2348034057037";
$message= "Your sms message goes here";

?>
<?php

$postUrl = "http://www.infobip.com/AddOn/SMSService/XML/XMLInput.aspx";
// XML-formatted data

$xmlString =
"<SMS>
<authentification>
<username>$user</username>
<password>$pass</password>
</authentification>
<message>
<sender>$sender</sender>
<text>$message</text>
</message>
<recipients>
<gsm>$mobileno</gsm>
</recipients>
</SMS>";

// previously formatted XML data becomes value of “XML” POST variable

$fields = "XML=" . urlencode($xmlString);
// in this example, POST request was made using PHP’s CURL

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $postUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
// response of the POST request
$response = curl_exec($ch);

// redirect the page upon successful sending

header("Location:customized/successfullysentbulksms.php"); 
curl_close($ch);

?>



/// code end

我曾经尝试过调整代码,以便通过连接到具有以下字段(id、name、mobileno)的 mysql 表来发送自定义的多条短信,这样我就可以选择 10 个收件人并发送一个自定义消息,以便每个收件人收到相同的消息,消息中显示他的姓名,例如“亲爱的(.$name),感谢您今天访问我们的商店”

从我所知道的小 php 中,我相信我应该连接到数据库以选择我的收件人,然后编写一个“do 或 while 循环”,这将使脚本能够重复或循环这个函数直到它有已成功向所有收件人发送短信。

我目前无法嵌入我的循环功能,如果有人可以看看我到目前为止所做的事情并帮助我,我会很高兴。

我的代码调整版本 ////////////////////////////////// //

<?php
$host="localhost"; // Host name
$username="user"; // Mysql username
$password="password"; // Mysql password
$db_name="db"; // Database name
$tbl_name="mysqltb"; // Table name


// Connect to server and select database.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

// Retrieve data from database
$sql="SELECT * FROM $tbl_name";
$result=mysql_query($sql);

// Start looping rows in mysql database.
$row=mysql_fetch_array($result);
?>

<?
mysql_close();
?>



<?php  

 $mobileno = $row['mobileno'];
 $name = $_row['name'];

$user="smsgateway_user";
$pass="smsgateway_password";
$sender= "sendername";

?>
<?php

$message = "you have received a customized bulk sms that is suppose to display your name";
$message2= "Dear ".$name." ".$message ; 


$postUrl = "http://www.infobip.com/AddOn/SMSService/XML/XMLInput.aspx";
// XML-formatted data

$xmlString =
"<SMS>
<authentification>
<username>$user</username>
<password>$pass</password>
</authentification>
<message>
<sender>$sender</sender>
<text>$message2</text>
</message>
<recipients>
<gsm>$no</gsm>
</recipients>
</SMS>";

// previously formatted XML data becomes value of “XML” POST variable

$fields = "XML=" . urlencode($xmlString);
// in this example, POST request was made using PHP’s CURL

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $postUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
// response of the POST request
$response = curl_exec($ch);

// redirect the page upon successful sending

header("Location:customized/successfullysentbulksms.php"); 
curl_close($ch);

?>

【问题讨论】:

    标签: php xml loops sms


    【解决方案1】:

    嗯,我在查看您的代码时看到了一些不正确的东西。主要的事情是 1) $row 变量之一被命名为 $_row; 2)当您循环查询的返回时,您应该使用标准模式while ($row = mysql_fetch_array($result)),然后每一行都将被循环,而不是您只获取第一行。 这是你想要做的一个例子

    <?php
    $host     = "localhost"; // Host name
    $username = "user"; // Mysql username
    $password = "password"; // Mysql password
    $db_name  = "db"; // Database name
    $tbl_name = "mysqltb"; // Table name
    
    $user     = "smsgateway_user"; //sms user
    $pass     = "smsgateway_password"; //sms password
    $sender   = "sendername"; //sms sender name
    
    $postUrl  = "http://www.infobip.com/AddOn/SMSService/XML/XMLInput.aspx"; //XML Post url
    
    // Connect to server and select database.
    mysql_connect("$host", "$username", "$password")or die("cannot connect");
    mysql_select_db("$db_name")or die("cannot select DB");
    
    // Retrieve data from database
    $sql = "SELECT * FROM $tbl_name WHERE `send_status`=0";
    $result = mysql_query($sql);
    
    // Start looping rows in mysql database.
    $totalCount = mysql_num_rows($result);
    $successCount = 0;
    while ($row = mysql_fetch_array($result))
    {
        $mobileno = $row['mobileno'];
        $name = $row['name'];
    
        $message = "Dear $name "; //Start message
        $message .= "you have received a customized bulk sms that is suppose to display your name";  //append to message
    
    
        // XML-formatted data
    
        $xmlString =
        "<SMS>
        <authentification>
        <username>$user</username>
        <password>$pass</password>
        </authentification>
        <message>
        <sender>$sender</sender>
        <text>$message</text>
        </message>
        <recipients>
        <gsm>$no</gsm>
        </recipients>
        </SMS>";
    
        // previously formatted XML data becomes value of “XML” POST variable
    
        $fields = "XML=" . urlencode($xmlString);
        // in this example, POST request was made using PHP’s CURL
    
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $postUrl);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
        // response of the POST request
        $response = curl_exec($ch);
    
        //Might want to check the response here, see if it gives a true, or a 1 to say the message was sent successfully
        if ($response)
        {
            $sql = "UPDATE `$tbl_name` SET `send_status`=1 WHERE `mobileno`='$mobileno' LIMIT 1";
            $result = mysql_query($sql);
            if (mysql_affected_rows($result) == 1) //success updating database
            {
                $successCount++;
            }
        }
        // redirect the page upon successful sending
        curl_close($ch);
    }
    if ($successCount == $totalcount)
        header("Location:customized/successfullysentbulksms.php"); 
    else
        echo "Error Sending.  $successCount out of $totalcount were successfully sent";
    ?>
    

    注意:因为这使用了您的数据库和短信提供商,所以我无法测试这段代码。
    如果您对它的工作原理有任何疑问,我很乐意回答。

    编辑:
    我已更新代码以包含一条 mysql 更新语句,以便在发送消息后将“send_status”列设置为 true。我还修改了 mysql select 语句,只从数据库中获取尚未发送到的手机号码(send_status 为 false)。
    希望有帮助

    【讨论】:

    • @mazzzzz 感谢您的解释性回答,我试了一下,效果很好。我只需要再做一些调整,例如引入一个名为“send_status”的新字段,并自动将我的表行更新为“已发送”,以便让我能够跟踪成功发送的收件人。我将很高兴看到这个功能如何嵌入到您的答案中。
    • 重新上传了修改后的代码。我建议你学习一些 sql。 PHP 的数据库后端功能要强大得多。
    • @mazzzzz 非常感谢您的快速响应,我尝试了修改,但我注意到我收到以下错误显示:解析错误:语法错误,意外 T_ENCAPSED_AND_WHITESPACE,期望 T_STRING 或 T_VARIABLE 或 T_NUM_STRING 在 / home/notifytx/public_html/api/smsloop2.php 在第 66 行。我猜这个错误是 $row['mobileno'] 的结果,所以我用 $no 代替了它。然而这有效,但唯一的问题是它没有执行常规循环,而是仅发送和发送短信以及更新单个记录。我想知道为什么?
    • 我认为这是因为我使用了错误的变量,因为我无权访问您的网关等,我实际上无法检查语法(不会抛出 curl 错误)。我更新了它,希望它会工作。另外,我设置它以便脚本只循环尚未发送到的数字,send_status 设置为 0 (false)
    • @mazzzzz 请您将您的电子邮件地址发送到 tundeaguda[at]gmail.com 给我。我遇到了更多错误,但我想向您发送一封带有附件的邮件,以便更好地解释。感谢您迄今为止的所有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    相关资源
    最近更新 更多