2013-05-20 18 views
0

我再次來到這裏再次請求幫助,我已經在mysql中創建了一個存儲過程,當它在sgb上調用它像SQLyog或MySQL Workbench時,我檢索了一個通常我的查詢結果,但是當我在php上執行相同的操作並執行mysql_query時,沒有任何結果。php調用mysql過程不檢索結果

這是我執行mysql查詢的函數。

function conect($SERVER){ 
     if (strtoupper($SERVER) =='MYSQL') { 
     $this->con=mysql_connect(SQL_SERVER,SQL_USER,SQL_PASSWD)or die(mysql_error()); 
     $this->db=mysql_select_db(SQL_DB,$this->con); 
      if ($this->con == 0){ 
       $retorno = "CONECTION ERROR - SERVER!<br>"; 
      } 
      else if ($this->db == 0){ 
       $retorno = "CONECTION ERROR - DATA BASE!<br>"; 
      } else { 
       $retorno = ""; 
      } 

      return $retorno; 

     } 

    } 

    function isConected(){ 
     if($this->con == false) 
      return false; 
     return true; 
    } 

    function execute($qry, $res="load"){ 
     if(!$this->isConected()) 
      $this->conect('MYSQL'); 

     $this->result[$res] = mysql_query($qry, $this->con) or trigger_error(mysql_error() . ": \n" . __FILE__ . ": \n" . $res . " - " . $qry); 
     if($this->result[$res])return true; 
     trigger_error(mysql_error()); 
     return false; 
    } 

    function get_fetch_assoc($res="load"){ 
     return mysql_fetch_assoc($this->result[$res]); 
    } 

這是我的過程調用

$mysql = new conexao(); 

      $qry = "CALL spGetChamadoMaisAntigo('".$uareas."', '".$_SESSION["dpto_codigoUrl"]."')"; 

      $mysql->execute($qry, 'Load'); 

      while($row = $mysql->get_fetch_assoc('Load')){ 
       $chamadosAbilitados[] = $row; 
      } 

我已經測試這個功能使用

SELECT * FROM表名

做一個簡單的查詢,並將其返回正常結果。

這裏是我的程序

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `ocomon_rc6`.`spGetChamadoMaisAntigo`$$ 

CREATE DEFINER=`renancr`@`%` PROCEDURE `spGetChamadoMaisAntigo`(IN Sistema VARCHAR(1000),IN CodigoUrl INT) 
BEGIN 
    CALL lib_Explode(',' , Sistema); 
    DROP TABLE IF EXISTS ocomon_rc6.TempChamados; 

    CREATE TABLE IF NOT EXISTS ocomon_rc6.TempChamados(numero INT, dias_apos_abertura INT); 
    INSERT INTO TempChamados(numero, dias_apos_abertura) 
    SELECT 
     o.numero, 
     (CASE 
      WHEN CONVERT(NOW(), TIME) > CONVERT(o.data_abertura, TIME) THEN DATEDIFF(NOW(), o.data_abertura) 
      ELSE DATEDIFF(DATE_SUB(NOW(),INTERVAL 1 DAY), o.data_abertura) 
     END) 
    FROM 
     ocorrencias as o 
    LEFT JOIN 
     sistemas AS a ON 
      a.sis_id = o.sistema 
    LEFT JOIN 
     sistemas_x_url AS su ON 
      a.sis_id = su.sis_id 
    LEFT JOIN 
     urls ON 
      su.codigoUrl = urls.codigoUrl 
    LEFT JOIN 
     localizacao AS l ON 
      l.loc_id = o.local 
    LEFT JOIN 
     instituicao AS i ON 
      i.inst_cod = o.instituicao 
    LEFT JOIN 
     usuarios AS u ON 
      u.user_id = o.operador 
    LEFT JOIN 
     usuarios AS ua ON 
      ua.user_id = o.aberto_por 
    LEFT JOIN 
     `status` AS s ON 
      s.stat_id = o.status 
    LEFT JOIN 
     status_categ AS stc ON 
      stc.stc_cod = s.stat_cat 
    LEFT JOIN 
     problemas AS p ON 
      p.prob_id = o.problema 
    LEFT JOIN 
     sla_solucao AS sls ON 
      sls.slas_cod = p.prob_sla 
    LEFT JOIN 
     prioridades AS pr ON 
      pr.prior_cod = l.loc_prior 
    LEFT JOIN 
     sla_solucao AS slr ON 
      slr.slas_cod = pr.prior_sla 
    LEFT JOIN 
     script_solution AS sol ON 
      sol.script_cod = o.oco_script_sol 
    LEFT JOIN 
     prior_atend AS prioridade_atendimento ON 
      prioridade_atendimento.pr_cod = o.oco_prior 
    LEFT JOIN 
     sistemas_x_filtro AS filtr ON 
      filtr.codigoSistemaFiltro = o.filtro 
    WHERE 
     s.stat_painel IN (2) 
    AND o.sistema IN (SELECT val FROM lib_Explode) 
    AND su.codigoUrl = CodigoUrl 
    AND o.oco_scheduled = 0 
    ORDER BY 
     o.data_abertura; 
    DROP TABLE IF EXISTS lib_Explode; 
    SELECT * FROM TempChamados WHERE dias_apos_abertura = (SELECT MAX(dias_apos_abertura) FROM TempChamados); 

    DROP TABLE IF EXISTS ocomon_rc6.TempChamados; 
    END$$ 

DELIMITER ; 

有人有一個想法,我在做什麼錯了?

+0

提示:僅對變量,函數,類等使用英文名稱。更多的人會理解你的代碼。 – migg

+1

我強烈建議不要使用'mysql_xxx()'函數。它們已被棄用,不再受支持。但特別是在這種情況下,您需要知道這些舊功能並不完全支持mySql中的許多高級功能,包括存儲過程。我建議切換到完全支持現代mySQL功能的PDO庫。這很可能涉及到更改大量代碼,但它確實是唯一適合您的良好解決方案。 – Spudley

回答

0

解決了,我已經分析了這個教程http://www.joeyrivera.com/2009/using-mysql-stored-procedures-with-php-mysqlmysqlipdo/,它給了我一個答案,需要聲明它需要發送給php的所有參數,並將選擇的結果插入到這個參數中,我修改了我的過程,並調用帶@和finaly的這個輸出參數的過程用@簡單地選擇了這個輸出參數,如下所示。

改變的過程

DROP PROCEDURE IF EXISTS `ocomon_rc6`.`spGetChamadoMaisAntigo`$$ 

CREATE DEFINER=`renancr`@`%` PROCEDURE `spGetChamadoMaisAntigo`(IN Sistema VARCHAR(1000),IN CodigoUrl INT, OUT numero INT, OUT diasAposAbertura INT) 

的改變了internar選擇並把它插入到出參數

SELECT idOcorrencia, dias_apos_abertura INTO numero , diasAposAbertura FROM TempChamados WHERE dias_apos_abertura = (SELECT MAX(dias_apos_abertura) FROM TempChamados); 

在我改變過程的呼叫像下面的PHP的參數。

$qry = "CALL spGetChamadoMaisAntigo('".$uareas."', '".$_SESSION["dpto_codigoUrl"]."', @numero , @diasAposAbertura)"; 
$mysql->execute($qry, 'Load'); 

最後我做了如下所示的輸出參數選擇。

$qry = "SELECT @numero , @diasAposAbertura"; 
$mysql->execute($qry, 'Load');