2015-07-16 1 views
1

У меня есть сценарий, где он отправляет sms всем членам. Во-первых, когда я отправляю SMS-сообщение, я храню в базе данных MySQL, а затем извлекаю то же самое из другого сценария и отправляю пакетно на поставщика SMS-шлюза.Обработать запрос MySQL на основе условий столбца в PHP

Расписание sms-таблицы имеет следующие столбцы.

`id, to, senderid, message, unicode, status` 

Unicode имеет 3 значения, как 1,2,3

1 = english 
2 = unicode 
3 = flash 

Затем я выполнить запрос, как это в PHP

$sql = "SELECT `to`, `senderid`, `message` FROM `sch_sms` WHERE `status`='0' AND `unicode` = '1' LIMIT 1000 

Затем я создаю for loop и отправить смс с помощью хрон.

В настоящее время мне, возможно, придется написать вышеуказанный запрос sql 3 раза и выполнить 3 раза по-разному, чтобы отправить смс на основе условий unicode.

Что бы я хотел знать, возможно ли сделать один запрос для всех трех разных значений в Юникоде, а также один for loop, а затем обработать мою функцию php sms.

Любой совет будет очень благодарен.

+0

Просто отмените условие 'AND' unicode' = '1'' из предложения WHERE и проверьте столбец 'unicode' в строке в вашем php-скрипте .... – VolkerK

+0

@AbdoAdel, вы говорите, я должен запросить всю колонку сначала, а затем обрабатывать в 'for loop'? – sammry

ответ

4

Используйте IN, чтобы увидеть, если код в колонке:

SELECT `to`, `senderid`, `message`, `unicode` 
FROM `sch_sms` 
WHERE `status`='0' 
AND `unicode` IN('1','2','3') 
LIMIT 1000 

Если только эти три значения в этом столбце вы можете опустить условие целиком:

SELECT `to`, `senderid`, `message`, `unicode` 
FROM `sch_sms` 
WHERE `status`='0' 
LIMIT 1000 

Проделав выше вы можете настроить цикл while, где вы можете использовать оператор switch для определения способа отправки сообщения (псевдокод) -

while($row = <appropriate database function here>) { 

    switch ($row['unicode']) { 
    case 1: 
     // code for this send type 
    break; 
    case 2: 
     // code for this send type   
    break; 
    case 3: 
     // code for this send type   
    break; 
} 
+2

Или еще короче просто удалите 'AND unicode IN ('1', '2', '3')' – Daan

+0

это не может быть сделано, поскольку мне нужно отправить значение unicode в функцию sms – sammry

+1

«Мне нужно отправить значение Unicode», - просто выберите значение из записей в результирующем наборе? Если вам нужно отправить их «массовым» на ваш sms-шлюз, используйте инструкцию ORDER BY и проверьте, имеет ли текущая запись одно и то же значение unicode, как и последнее; если нет ... это следующая группа. – VolkerK

2

Подобно тому, как иллюстрация того, что я имел в виду

Если вы должны отправить их «навалом-накрест» к вашему смс шлюз использовать ORDER BY заявление и проверить, если текущая запись имеет то же значение Юникода как последний один; если нет ... это следующая группа.

(не уверен, что если вы действительно нуждаетесь в этом, хотя ....)

<?php 
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
    PDO::MYSQL_ATTR_DIRECT_QUERY => false, 
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION 
)); 
setup($pdo); 

$currentUnicode = null; 
foreach($pdo->query('SELECT unicode, message FROM soFoo WHERE status=0 ORDER BY unicode', PDO::FETCH_ASSOC) as $row) { 
    // check if this message is the first of a new unicode-group 
    if ($row['unicode']!==$currentUnicode) { 
     switchCode($row['unicode']); 
     // it's the new "current" group 
     $currentUnicode=$row['unicode']; 
    } 

    sendSMS($row); 
} 

function switchCode($newCode) { 
    echo "--- switching to new Code: $newCode ---\r\n"; 
} 

function sendSMS($data) { 
    echo "sending msg: {$data['message']}\r\n"; 
} 

// boilerplate, creates temp table and inserts sample data.... 
function setup($pdo) { 
    $pdo->exec(' 
     CREATE TEMPORARY TABLE soFoo (
      id int auto_increment, 
      message varchar(32), 
      unicode int, 
      status int, 
      primary key(id) 
     ) 
    '); 
    $stmt = $pdo->prepare('INSERT INTO soFoo (message,unicode, status) VALUES (?,?,0)'); 
    $stmt->bindParam(1, $message); 
    $stmt->bindParam(2, $unicode); 

    foreach(range('a','k') as $c) { 
     foreach(range(1,3) as $unicode) { 
      $message = sprintf('msg%d%s', $unicode, $c); 
      $stmt->execute(); 
     } 
    } 
} 

отпечатки

--- switching to new Code: 1 --- 
sending msg: msg1a 
sending msg: msg1g 
sending msg: msg1e 
sending msg: msg1h 
sending msg: msg1d 
sending msg: msg1i 
sending msg: msg1c 
sending msg: msg1j 
sending msg: msg1b 
sending msg: msg1k 
sending msg: msg1f 
--- switching to new Code: 2 --- 
sending msg: msg2i 
sending msg: msg2j 
sending msg: msg2h 
sending msg: msg2g 
sending msg: msg2k 
sending msg: msg2f 
sending msg: msg2c 
sending msg: msg2a 
sending msg: msg2e 
sending msg: msg2d 
sending msg: msg2b 
--- switching to new Code: 3 --- 
sending msg: msg3a 
sending msg: msg3j 
sending msg: msg3b 
sending msg: msg3i 
sending msg: msg3f 
sending msg: msg3c 
sending msg: msg3h 
sending msg: msg3d 
sending msg: msg3g 
sending msg: msg3e 
sending msg: msg3k 

switchCode() будет функция, чтобы позволить вашему смс шлюзу знать, чтобы переключить Юникод ,

редактировать:
в pseude-кода ваш рабочий процесс может выглядеть как-то

if (changed(unicode) or changed(message) or toolong($to+row['to'])) { 
    send current sms request to gateway 
    reset unicode, message, to 
} 
else { 
    concat $to $row['to'] 
} 

Это будет оффтоп, но вы можете рассмотреть другой макет таблицы, как, например,

CREATE TABLE smsUsers (
    user_id int auto_increment, 
    user_unicode int, 
    user_phonenumber ..., 
    ... 
) 

CREATE TABLE smsMessages (
    message_id int auto_increment, 
    message varchar(32), 
    ... 
) 

CREATE TEMPORARY TABLE smsMessageQueue (
    queue_id int auto_increment, 
    message_id int, 
    user_id int, 
    queue_status int, 
    ... 
) 

по меньшей мере было бы менее дорого, чтобы различать тексты сообщений и, вероятно, экономить место в базе данных.

+0

спасибо, это тоже должно сделать трюк. но поле 'to' - это номера телефонов, на которых провайдер шлюза принимает максимум 150 номеров в транзакции с одним апи. Мне нужно взорвать номера телефонов до 150, а затем обработать sms-функцию. Помогает ли это с вашим кодом? – sammry

+0

О, теперь это становится немного сложнее. 'message' будет одинаковым для всех записей? Что происходит, когда вы отправляете следующую трансляцию? – VolkerK

+0

yes, 'message' будет таким же или другим, что и для значений' unicode'. Если это английский, значение unicode равно 1 с разными номерами телефонов, а если оно французское, то значение Unicode равно 2 с разными номерами телефонов. То, где я даже зацикливаюсь – sammry

Смежные вопросы