Устранение неполадок соединения PHP / MSSQL - PullRequest
0 голосов
/ 12 июля 2011

У меня есть скрипт php, который отправляет значения, данные ему, в базу данных MSSQL.Это работает около 70% времени (должно быть ~ 100 записей, я посмотрю ~ 70).Там нет модели, которую я могу видеть.Я не ищу помощи, просматривая журналы, которые у меня уже есть;Мне нужно знать, где я должен искать ошибки.PHP простой, используя mssql_query, mssql_num_rows и mssql_fetch_array.Тайм-аут в php.ini не изменился с 60-х по умолчанию, хотя я только что установил его на 240-е (если это все исправит, я обновлю пост).Я не могу ничего вернуть после вызова скрипта;каждый ответ, есть ли ошибка или нет, должен быть одинаковым.Могу ли я как-нибудь записать детали функции mssql_query?Или есть ответ от сервера SQL, который я могу прослушать?Я прочитал руководство и не видел ничего подобного.Любая помощь будет оценена!Мне нужно позаботиться об этом как можно скорее.

edit - я не могу запустить mssql_showlastmessage, потому что я не могу ничего вернуть, кроме как, когда все сломается.Ниже приведен весь код.

<?php
//request xml cdr from switchvox
error_reporting(E_ALL);

//include switchvox libraries
require_once("SwitchvoxRequest.php");

//define sql connection stuff
$db_host = "dbhost";
$db_user = "dbuser";
$db_pass = "dbsecret";
$db = "db";
$table_sr = "tblsr";
$table_cd = "tblcmrd";
$link = mssql_connect($db_host, $db_user, $db_pass);
$err = "";

//make sure we can connect
if (!$link || !mssql_select_db($db, $link))
        {
            die("<response></response>");
        }

//define pbx connection stuff
$sv_host = "pbx";
$sv_user = "user";
$sv_pass = "secret";

//get the extension from the pbx and format it
$ext = $_GET['ext'];
$ext2 = $_GET['ext2'];
$jobid = $_GET['jobid'];
$et = $_GET['et'];

if(!$ext2)
        {
        $ext = substr($ext,-4,4);
        }

if(strlen($ext) > 4)
        {
        if(strlen($ext2) > 4)
                {
                die("<response></response>");
                }
        $ext = $ext2;
        }

//query the sr table to find the account ID of the extension we are referencing
$acid_sql = "SELECT * FROM $table_sr WHERE ext=$ext";
$acid_res = mssql_query($acid_sql);
$acida = mssql_fetch_array($acid_res, MSSQL_BOTH);
$acid = $acida['pbx_accountid'];

if (!$acid_res) 
        {
            die("<response></response>");
        }

//make sure there is a salesrep for the extension making the call
if (!$acid)
        {
            die("<response></response>");
        }

//get and format the time and date as YYYY-MM-DD
$date = date('Y') . "-" . date('m') . "-" . date('d');

//format the time as HH:MM:SS
$time = date('H') . ":" . date('i') . ":" . date('s');

//create a new request
$req = new SwitchvoxRequest($sv_host, $sv_user, $sv_pass);
$reqpar = array
        (
        'account_ids' => array
                (
                'account_id' => array
                        (
                        $acid
                        )
                ),
            'start_date' => array
                (
                $date . " " . "00:00:00"
                ),
        'end_date' =>  array
                (
                $date . " " . $time
                ),
        'sort_field' => array
                (
                ),
        'sort_order' => array
                (
                'DESC'
                )
        );
$res = $req -> send("switchvox.callLogs.search", $reqpar);
$result = $res->getResult();
$calls = $result['calls']['total_items'];

//check that there were calls to/from this account today
if(!$calls)
        {
        die("<response></response>");
        }

$latest = $result['calls']['call']['0'];
$callid = $latest['id'];

//check to see if the call has already been logged
$id_sql = "SELECT * FROM $table_cd WHERE callID='$callid'";
$id_res = mssql_query($id_sql);
$exid = mssql_fetch_array($id_res, MSSQL_ASSOC);

if (!$id_res) 
        {
    die("<response></response>");
        }

if($exid['callID'])
        {
        die("<response></response>");
        }

//define variables to be sent to the table
$from = $latest['from_number'];
$to = $latest['to_number'];
$durat = $latest['talk_duration'];
$start = $latest['start_time'];
$callid = $latest['id'];
$calltype = $latest['origination'];

//check the length of the cid/ext strings and swap if needed
if (strlen($from) > strlen($to))
        {
        $extension = $to;
        $phonenumber = $from;
        }
        else
        {
        $extension = $from;
        $phonenumber = $to;
        }

//insert the data into the table
$fi_sql = "INSERT INTO $table_cd (extension, phonenumber, calldatetime, duration, callID, calltype)     VALUES ($extension, $phonenumber, '$start', '$durat', '$callid', '$calltype')";
$fi_res = mssql_query($fi_sql);

if (!$fi_res) 
{
    die("<response></response>");
}

$sv_res = "<response></response>";

echo $sv_res;
?>

Я понимаю, что это открыто для инъекций sql.Это нормально.

edit -

Я просмотрел журналы в базе данных;нет никаких ошибок, когда я ожидал, что там были вставлены данные, и ничего даже не указывает на то, что они пытались.Я собираюсь посмотреть на то, что будет регистрировать сообщения в системный журнал или что-то из php.предложения приветствуются.

1 Ответ

0 голосов
/ 13 июля 2011

Как правило, вы можете выполнить это на MySQL

EXPLAIN SELECT ...

, чтобы получить описание оператора SELECT .Эта функция в основном объясняет, как анализатор запросов MySQL видит ваш запрос и как он будет выполняться.Например, EXPLAIN описывает, собирается ли MySQL выполнять дорогостоящее сканирование таблиц или может использовать индекс, и если да, то какой именно.

Вы уверены, что MySQL вызывает проблему?Или PHP может вызвать проблемы?

Вы проверяете mysql_error () после каждого запроса?

Возможно, $ ext не числовое?В этом случае $ ext должен заключаться в кавычки (извините, не нравится подстановка переменных внутри строки):

$acid_sql = "SELECT * FROM " .  $table_sr . " WHERE ext='" . $ext . "'";

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

<response>
   ... other elements ...
  <sysInfo>
    Failed to perform...
  </sysInfo>
</response>

Хорошо ведущий себя XML-клиент должен только читать известные элементы и, таким образом, пропускать дополнительные элементы.Добавление такого логического кода возврата всегда полезно.

PS: Хотя приведенный выше код может быть просто примером, позвольте мне заметить, что он может быть атакован sql-инъекциями .

...