【问题标题】:MySQL query returns no results with PDOMySQL 查询不返回 PDO 的结果
【发布时间】:2017-05-18 00:42:34
【问题描述】:

我对 PDO 和 MySQL 有疑问。 当我通过 phpMyAdmin 将该查询发送到 MySQL 时,它返回 490 行:

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;
?> 

可能是什么问题?

【问题讨论】:

  • 你的 error_logs/exceptions.txt 是怎么说的?
  • 您应该尝试格式化您的 SQL 查询,以便人们可以实际阅读它们,而不是 500 个字符长的单行。
  • 没有错误或异常。我什至激活了 MySQL 日志。它根本不返回任何结果。
  • @Jay 这与另一个问题不同,因为它是表名中的拼写错误。请不要过快将问题标记为重复。
  • 标记太快?在您在这里发表评论之前,我们不可能知道您的表名有错字。

标签: php mysql pdo


【解决方案1】:

感谢杰伊·布兰查德,

这是关于如何在 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;
?> 

【讨论】:

    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2023-02-09
    • 2021-11-27
    相关资源
    最近更新 更多