2

i wanna create a form that can send sms to multiple recipient, i've created a form that uses javascript to add or remove textbox dynamically, this code successfully send sms when i fill one recipient number, but fails to send more than one recipient, and i want to know how do i make this form sends sms towards multiple user

as i try to make it send sms to more than one user by making it loop, i get this error, Can someone help?

Warning: Invalid argument supplied for foreach()

<SCRIPT language="javascript">
        function addRow(tableID) {

            var table = document.getElementById(tableID);

            var rowCount = table.rows.length;
            var row = table.insertRow(rowCount);

            var cell1 = row.insertCell(0);
            var element1 = document.createElement("input");
            element1.type = "checkbox";
            element1.name="chkbox[]";
            cell1.appendChild(element1);

            var cell2 = row.insertCell(1);
            cell2.innerHTML = rowCount + 1;

            var cell3 = row.insertCell(2);
            var element2 = document.createElement("input");
            element2.type = "text";
            element2.name = "CTL_TEL";

            cell3.appendChild(element2);


        }

        function deleteRow(tableID) {
            try {
            var table = document.getElementById(tableID);
            var rowCount = table.rows.length;

            for(var i=0; i<rowCount; i++) {
                var row = table.rows[i];
                var chkbox = row.cells[0].childNodes[0];
                if(null != chkbox && true == chkbox.checked) {
                    table.deleteRow(i);
                    rowCount--;
                    i--;
                }


            }
            }catch(e) {
                alert(e);
            }
        }

    </SCRIPT>


<?php


error_reporting(E_ALL ^ E_NOTICE);

//Example

$gsm_send_sms = new gsm_send_sms();
$gsm_send_sms->debug = false;
$gsm_send_sms->port = 'COM6';
$gsm_send_sms->baud = 115200;
$gsm_send_sms->init();
$name="CTL_TEL[]";



foreach ($tel as $_POST['CTL_TEL']) {

$status = $gsm_send_sms->send($_POST["CTL_TEL"] , $_POST["CTL_MSG"]);
$status = $gsm_send_sms->send($tel , $_POST["CTL_MSG"]); 


if ($status) {
    echo "Message sent\n";
} else {
    echo "Message not sent\n";
}
}

$gsm_send_sms->close();







//Send SMS via serial SMS modem
class gsm_send_sms {

    public $port = 'COM6';
    public $baud = 115200;

    public $debug = false;

    private $fp;
    private $buffer;

    //Setup COM port
    public function init() {

        $this->debugmsg("Setting up port: \"{$this->port} @ \"{$this->baud}\" baud");

        exec("MODE {$this->port}: BAUD={$this->baud} PARITY=N DATA=8 STOP=1", $output, $retval);

        if ($retval != 0) {
            throw new Exception('Unable to setup COM port, check it is correct');
        }

        $this->debugmsg(implode("\n", $output));

        $this->debugmsg("Opening port");

        //Open COM port
        $this->fp = fopen($this->port . ':', 'r+');

        //Check port opened
        if (!$this->fp) {
            throw new Exception("Unable to open port \"{$this->port}\"");
        }

        $this->debugmsg("Port opened");
        $this->debugmsg("Checking for responce from modem");

        //Check modem connected
        fputs($this->fp, "AT\r");

        //Wait for ok
        $status = $this->wait_reply("OK\r\n", 5);

        if (!$status) {
            throw new Exception('Did not receive responce from modem');
        }

        $this->debugmsg('Modem connected');

        //Set modem to SMS text mode
        $this->debugmsg('Setting text mode');
        fputs($this->fp, "AT+CMGF=1\r");

        $status = $this->wait_reply("OK\r\n", 5);

        if (!$status) {
            throw new Exception('Unable to set text mode');
        }

        $this->debugmsg('Text mode set');

    }

    //Wait for reply from modem
    private function wait_reply($expected_result, $timeout) {

        $this->debugmsg("Waiting {$timeout} seconds for expected result");

        //Clear buffer
        $this->buffer = '';

        //Set timeout
        $timeoutat = time() + $timeout;

        //Loop until timeout reached (or expected result found)
        do {

            $this->debugmsg('Now: ' . time() . ", Timeout at: {$timeoutat}");

            $buffer = fread($this->fp, 1024);
            $this->buffer .= $buffer;

            usleep(200000);//0.2 sec

            $this->debugmsg("Received: {$buffer}");

            //Check if received expected responce
            if (preg_match('/'.preg_quote($expected_result, '/').'$/', $this->buffer)) {
                $this->debugmsg('Found match');
                return true;
                //break;
            } else if (preg_match('/\+CMS ERROR\:\ \d{1,3}\r\n$/', $this->buffer)) {
                return false;
            }

        } while ($timeoutat > time());

        $this->debugmsg('Timed out');

        return false;

    }

    //Print debug messages
    private function debugmsg($message) {

        if ($this->debug == true) {
            $message = preg_replace("%[^\040-\176\n\t]%", '', $message);
            echo $message . "\n";
        }

    }

    //Close port
    public function close() {

        $this->debugmsg('Closing port');

        fclose($this->fp);

    }

    //Send message
    public function send($tel, $message) {

        //Filter tel
        $tel = preg_replace("%[^0-9\+]%", '', $tel);

        //Filter message text
        $message = preg_replace("%[^\040-\176\r\n\t]%", '', $message);

        $this->debugmsg("Sending message \"{$message}\" to \"{$tel}\"");

        //Start sending of message
        fputs($this->fp, "AT+CMGS=\"{$tel}\"\r");

        //Wait for confirmation
        $status = $this->wait_reply("\r\n> ", 5);

        if (!$status) {
            //throw new Exception('Did not receive confirmation from modem');
            $this->debugmsg('Did not receive confirmation from modem');
            return false;
        }

        //Send message text
        fputs($this->fp, $message);

        //Send message finished indicator
        fputs($this->fp, chr(26));

        //Wait for confirmation
        $status = $this->wait_reply("OK\r\n", 180);

        if (!$status) {
            //throw new Exception('Did not receive confirmation of messgage sent');
            $this->debugmsg('Did not receive confirmation of messgage sent');
            return false;
        }

        $this->debugmsg("Message sent");

        return true;

    }

}

?> 






<html>
<head>
<title>SMS via GSM</title>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
<style>
   .clbody {
   font-family:Verdana, Arial, Helvetica, sans-serif;
   font-size:9pt;
   font-weight:normal;
}
.clfooter {
   font-family:Verdana;
   font-size:7pt;
   font-weight:normal;
}
h1, .h1 {
   width:100%;
   font-family:Verdana, Arial, Helvetica, sans-serif;
   font-size:18px;
   font-weight:bold;
}
hr, .hr {
   color:#b0b0b0;
}
</style>
</head>

<body class="clbody">
<h1>SMS via GSM</h1>
<div style="WIDTH:700px">

</div>
<hr size="1">

<?php
error_reporting(E_ALL ^ E_NOTICE);
?>
<form action="" method="post" name="myForm">
<table class ="clbody" width="700" border="1">

   <tr>
      <td valign="top">Recipient:</td>
      <td valign="top">

      <INPUT type="button" value="Add Row" onclick="addRow('dataTable')" />

    <INPUT type="button" value="Delete Row" onclick="deleteRow('dataTable')" />

    <TABLE id="dataTable" width="350px" border="1">
        <TR>
            <TD><INPUT type="checkbox" name="chk"/></TD>
            <TD> 1 </TD>
            <TD> <input type="text" name="CTL_TEL" value="<?php  echo $_GET['CTL_TEL']; ?>"> </TD>
        </TR>
    </TABLE>



     </td>
   </tr>
   <tr>
      <td valign="top">Message:</td>
      <td valign="top">



      <input style="width: 250px" type="text" name="CTL_MSG" value="<?php echo $_GET['CTL_MSG']; ?>"></td>




   </tr>

      <tr>
      <td valign="top">Result code:<font color=green></td>
      <td valign="top"></td>
   </tr>   
   <tr>
      <td valign="top">&nbsp;</td>
      <td valign="top"><input size="25" type="submit" value="Send" name="CTL_SEND" style="height: 23px; width: 250px"></td>
   </tr>
</table>
<br>
<br>
</form>



</body>
</html>      
Azlan Mohd
  • 55
  • 1
  • 6
  • What are you struggling with exactly? You show a lot of code related to your specific application, bit it's not clear which part of this you need help with. If you just want to know how to get values from your HTML form into PHP, then the fact you're using them to send an SMS isn't really relevant. – IMSoP Mar 23 '13 at 11:59
  • may i know why it isnt really relevant? i'm struggling to make the form initiate sending sms based on the code there – Azlan Mohd Mar 23 '13 at 12:12
  • Start by adding `action` and `method` attributes to your `form` tag so that `CODE` is executed when the submit button is clicked. – Terje D. Mar 23 '13 at 12:26
  • 1
    @AzlanMohd It's a question of code separation: if you can write a function like `my_send_message_function($number, $message)` and it works successfully (sends an SMS) using a hard-coded number and message, then substituting those for input supplied by the user shouldn't require any changes to `my_send_message_function` - you're just providing different input. Similarly, if you can successfully capture input, you can use that input to save to a database, send an e-mail, or whatever you want. – IMSoP Mar 23 '13 at 12:51
  • If getting input *is* your problem, please read [this manual page](http://www.php.net/manual/en/language.variables.external.php). In short, the values from the form will appear in the array variables `$_GET` or `$_POST`, depending on the `method=""` attribute in your HTML `
    ` tag.
    – IMSoP Mar 23 '13 at 12:54
  • i've tried and get an error Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION as you can see, i've edited my post, these are the code that i've modify the code as u told, then gets error, i dont know how can i initiate it – Azlan Mohd Mar 23 '13 at 13:59
  • 1
    I would strongly suggest you start with a much simpler piece of code: remove all your JavaScript, don't worry about CSS, and don't try to send SMS yet; instead, write a simple form, and a function that echoes back the submitted data. Once you understand the basics of how PHP variables work (hint: `'$tel'` shouldn't have quotes around it, and `$tel` is not defined anywhere in that code anyway) you can build up to using the SMS sending function. – IMSoP Mar 23 '13 at 14:18
  • i think i've made it, the form successfully send sms! but to one recipient only, as i add another recipient and try to send, it fails, can someone help? how can i made it sent sms to more than one number in a same time? i've edited this post so that u can see it – Azlan Mohd Mar 23 '13 at 17:01
  • I agree, you are doing too much (when there is a problem present). Strip down to code *only* sending. Run multiple time and test thoroughly. Strip down to code *only* receiving. Test thoroughly. Do both and test. *Then* integrate with your remaining code. – hlovdal Apr 08 '13 at 16:51
  • BTW, thumbs up for your AT parsing, the overall impression is that it looks very reasonable, I've seen a lot worse code here on SO. – hlovdal Apr 08 '13 at 16:53

0 Answers0