MySQL не работает, когда ODBC находится в том же сценарии - PullRequest
0 голосов
/ 01 августа 2011

Компания, в которой я работаю, имеет базу данных Progress, в которой хранится большая часть их информации. Они попросили меня сделать PHP-скрипт, который сможет извлекать данные из него и объединять его с данными внутри базы данных MySQL.

Сначала я подумал, что просто выберу данные, но через некоторое время обнаружил, что Progress DB работает невероятно медленно. Я решил получить выборку страниц либо из MySQL, либо из Progress, в зависимости от того, какая из них была (MySQL превосходит Progress)

Я столкнулся с проблемой, хотя по какой-то причине ODBC и MySQL, кажется, не могут функционировать, когда оба открыты. Как я могу решить это? Можно ли сделать то, что мне нужно?

Примечание: я бросил ловушки для ошибок повсюду, и MySQL никогда не возвращал ошибку. ODBC всегда отправляет и возвращает содержимое, но никогда не вставляет его в базу данных MySQL

Вот мой код:

$job_num = "59505";
$fields = 'JobNum, Name, City, State, StartDate, ReqDueDate';
$field_queries = 'j.JobNum AS JobNum, Name, City, State, jh.StartDate AS StartDate, ReqDueDate';

//Determine if there is a record in the MySQL DB that has the job
$mysqlr = mysql_query("SELECT * FROM jobsinfo WHERE JobNum='$job_num'");
if(!$mysqlr){
    die(mysql_error());
}
//If there is a record, display it from there: faster
if(mysql_num_rows($mysqlr) > 0){
    //Take the fields and explode them into an array so that it can be looped through.
    $field_array = explode(', ', $fields);
    //Return each row from the database
    while($row = mysql_fetch_array($mysqlr)){
        //Return all fields in the array
        foreach($field_array as $key=>$field){
            echo $field .": ".$row[$field]."<br>";
        }
        //Because the Description comes from a different part of the Progress include it here.
        echo "Description:<br>".$row['Description'];
    }
}else{
    //If there is no record in the MySQL display it from the Progress AND copy it over.
    //Begin by inserting a record to later be modified
    mysql_query("INSERT INTO jobsinfo (JobNum) VALUES ('$job_num')") or die(mysql_error());
        $id = mysql_insert_id();
    //Connect to the Progress DB
    $conodbc = odbc_connect($dsn, $username, $password, SQL_CUR_USE_ODBC);
    //Explode the fields so that they can be looped through.
    $field_array = explode(', ', $fields);
    //Make the query to the Progress DB. Merge many tables into one query using JOINs
    $sql = "SELECT TOP 1 ".$field_queries." FROM PUB.JobProd j LEFT JOIN PUB.BookOrd b ON j.OrderNum=b.OrderNum LEFT JOIN PUB.Customer c ON b.CustNum=c.CustNum LEFT JOIN PUB.JobHead jh ON j.JobNum=jh.JobNum WHERE j.JobNum = '$job_num' ORDER BY ReqDueDate DESC";
        //Execute the query
        $rs = odbc_exec($conodbc,$sql) or die('Select failed!');
            //For each record loop through
            while(odbc_fetch_row($rs)){
                //For each field display
                foreach($field_array as $key=>$field){
                    $value = odbc_result($rs, $field);
                    echo $field.": ".$value."<br>";
                    //Update the previously inserted row with the correct information
                    mysql_query("UPDATE jobsinfo SET ".$field."='$value' WHERE id = '$id'");
                }
            }
    //Because there are multiple job parts it is easiest to just loop through it seperately and not JOIN it
    $sql_asmbl = "SELECT * FROM PUB.JobAsmbl AS ja WHERE JobNum = '$job_num'";
        //Execture
        $rs_asmbl = odbc_exec($conodbc,$sql_asmbl) or die('Select failed!');
        echo 'Description:<br>';
            $ptdesc ='';
            //Loop through all the rows that match the job number
            while(odbc_fetch_row($rs_asmbl)){
                $ptdesc .= odbc_result($rs_asmbl, 'PartNum') ." - ";
                $ptdesc .= odbc_result($rs_asmbl, 'Description') ."<br>";
            }
            $ptdesc = mysql_real_escape_string($ptdesc);
            //Update the MySQL
            mysql_query("UPDATE jobsinfo SET Description = '$ptdesc' WHERE id = '$id'");
            //Display it
            echo $ptdesc;
    //Close DB's
    odbc_close($conodbc);
    mysql_close($conn);
}

Ответы [ 3 ]

3 голосов
/ 01 августа 2011

Вы предполагаете, что запросы MySQL всегда выполняются успешно:

$mysql = mysql_query("SELECT * FROM jobsinfo WHERE JobNum='$job_num'");

if(mysql_num_rows($mysql) > 0){
}

Вы должны всегда проверять это явно:

$mysql = mysql_query("SELECT * FROM jobsinfo WHERE JobNum='$job_num'")
if( !$mysql ){
    die(mysql_error());
}
1 голос
/ 01 августа 2011

Я вижу, что вы устанавливаете соединение ODBC, но я не вижу mysql_connect () или чего-то подобного, используя mysqli или PDO. Вы на самом деле открываете сокет-соединение с mysql, и вы просто исключили это из этого примера кода, или вы забыли установить соединение в своем коде?

0 голосов
/ 01 августа 2011

Я немного переместил INSERT и удалил 'from (' JobNum '), и теперь он работает нормально.

Найдена причина ошибки. И MySQL, и ODBC использовали $ conn в качестве соединительной переменной. Это вызывало ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...