2017-01-03 240 views
0

我有一個PDO和MySQL的問題。 當我通過phpmyadmin發送查詢到MySQL,它會返回490行:MySQL查詢返回PDO沒有結果

SELECT art.AR_Ref AS AR_Ref, art.AR_Design AS AR_Design, art.AR_PrixVen AS AR_PrixVen, art.AR_CodeBarre AS AR_CodeBarre, af.CT_Num AS CT_Num, af.AF_RefFourniss AS AF_RefFourniss, ct.CT_Intitule AS CT_Intitule, art.CL_No1, art.CL_No2, art.CL_No3, art.CL_No4, MATCH (art.indexation) AGAINST ("+:iso*") AS cpt, art.AR_Design REGEXP "^:iso*" AS commencepar, art.AR_Design REGEXP ".+:iso.*" AS contient 
FROM f_article art 
    LEFT JOIN f_artfourniss af ON (art.AR_Ref = af.AR_Ref AND af.AF_Principal = 1) 
    LEFT JOIN f_comptet ct ON (af.CT_Num = ct.CT_Num AND ct.CT_Type = 1) 
WHERE art.AR_Sommeil = '0' AND MATCH (art.indexation) AGAINST (("+:iso*") IN BOOLEAN MODE) 
ORDER BY commencepar DESC, contient DESC, cpt DESC, art.AR_Ref 

但與該代碼,目前還沒有結果可言:

<?php 
$dbCon = new PDO('mysql:host=SERVER_IP; port=3306; dbname=DATABASE', 
    'root', 
    'PASSWORD', 
    array(PDO::ATTR_PERSISTENT => true, 
      PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); 

$sql = 'SELECT art.AR_Ref AS AR_Ref, art.AR_Design AS AR_Design, art.AR_PrixVen AS AR_PrixVen, art.AR_CodeBarre AS AR_CodeBarre, af.CT_Num AS CT_Num, af.AF_RefFourniss AS AF_RefFourniss, ct.CT_Intitule AS CT_Intitule, art.CL_No1, art.CL_No2, art.CL_No3, art.CL_No4, MATCH (art.indexation) AGAINST ("+:saisie1*") AS cpt, art.AR_Design REGEXP "^:saisie2*" AS commencepar, art.AR_Design REGEXP ".+:saisie3.*" AS contient FROM f_article art LEFT JOIN f_artfourniss af ON (art.AR_Ref = af.AR_Ref AND af.AF_Principal = 1) LEFT JOIN f_comptet ct ON (af.CT_Num = ct.CT_Num AND ct.CT_Type = 1) WHERE MATCH (art.indexation) AGAINST (("+:saisie4*") IN BOOLEAN MODE) ORDER BY commencepar DESC, contient DESC, cpt DESC, art.AR_Ref'; 
$stmt = $dbCon->prepare($sql); 
$saisie = 'iso'; 
$stmt->bindParam(':saisie1', $saisie, PDO::PARAM_STR); 
$stmt->bindParam(':saisie2', $saisie, PDO::PARAM_STR); 
$stmt->bindParam(':saisie3', $saisie, PDO::PARAM_STR); 
$stmt->bindParam(':saisie4', $saisie, PDO::PARAM_STR); 
$stmt->execute(); 
if (($stmt->errorCode() != '00000')){ 
    var_dump($stmt->errorInfo()); 
} else { 
    while($row = $stmt->fetch(PDO::FETCH_OBJ)) { 
     var_dump($row); 
    } 
    $stmt->closeCursor(); 
} 
$dbCon = null; 
?> 

可能是什麼問題呢?

+0

什麼你error_logs/exceptions.txt說? – happymacarts

+0

您應該嘗試格式化SQL查詢,以便人們可以實際讀取它們而不是500個字符長的單行。 – Mike

+0

沒有錯誤或異常。我什至激活MySQL日誌。它根本不會返回任何結果。 –

回答

0

由於傑伊·布蘭查德,

它是關於你如何格式化你的變量中的SQL語句。 您應該在每個變量 的bindParam()中進行格式化,佔位符替換整個變量以及圍繞它的任何條件 。

我找到了解決辦法:

<?php 
$dbCon = new PDO('mysql:host=SERVER_IP; port=3306; dbname=DATABASE', 
    'root', 
    'PASSWORD', 
    array(PDO::ATTR_PERSISTENT => true, 
      PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); 

$sql = 'SELECT art.AR_Ref AS AR_Ref, ' 
      . 'art.AR_Design AS AR_Design, ' 
      . 'art.AR_PrixVen AS AR_PrixVen, ' 
      . 'art.AR_CodeBarre AS AR_CodeBarre, ' 
      . 'af.CT_Num AS CT_Num, ' 
      . 'af.AF_RefFourniss AS AF_RefFourniss, ' 
      . 'ct.CT_Intitule AS CT_Intitule, ' 
      . 'art.CL_No1, ' 
      . 'art.CL_No2, ' 
      . 'art.CL_No3, ' 
      . 'art.CL_No4, ' 
      . 'MATCH (art.indexation) AGAINST (:saisie1) AS cpt, ' 
      . 'art.AR_Design REGEXP :saisie2 AS commencepar, ' 
      . 'art.AR_Design REGEXP :saisie3 AS contient ' 
    . 'FROM f_article art ' 
      . 'LEFT JOIN f_artfourniss af ON (art.AR_Ref = af.AR_Ref AND af.AF_Principal = 1) ' 
      . 'LEFT JOIN f_comptet ct ON (af.CT_Num = ct.CT_Num AND ct.CT_Type = 1) ' 
    . 'WHERE MATCH (art.indexation) AGAINST ((:saisie4) IN BOOLEAN MODE) ' 
    . 'ORDER BY commencepar DESC, ' 
      . 'contient DESC, ' 
      . 'cpt DESC, ' 
      . 'art.AR_Ref'; 
$stmt = $dbCon->prepare($sql); 
$saisie = 'iso'; 
$saisie1 = '+' . $saisie . '*'; 
$saisie2 = '^' . $saisie . '*'; 
$saisie3 = '.+' . $saisie . '.*'; 
$saisie4 = '+' . $saisie . '*'; 
$stmt->bindParam(':saisie1', $saisie1, PDO::PARAM_STR); 
$stmt->bindParam(':saisie2', $saisie2, PDO::PARAM_STR); 
$stmt->bindParam(':saisie3', $saisie3, PDO::PARAM_STR); 
$stmt->bindParam(':saisie4', $saisie4, PDO::PARAM_STR); 
$stmt->execute(); 
if (($stmt->errorCode() != '00000')){ 
    var_dump($stmt->errorInfo()); 
} else { 
    while($row = $stmt->fetch(PDO::FETCH_OBJ)) { 
     var_dump($row); 
    } 
    $stmt->closeCursor(); 
} 
$dbCon = null; 
?>