PDO选择语句SQL到MySQL不产生任何数据

时间:2015-01-18 13:29:37

标签: mysql sql json pdo

我发现在phpadmin和命令行中运行的SQL查询和其他SQL工具在PDO(PHP)下生成空白输出。

连接脚本和变量绑定正在运行。我收到200 OK但输出

[{"":""}]

应该生成这样的数据。

Apple Inc. (aapl) 
Last price:  $103.0 
WYT fair value (npv):  $87  
Upside to WYT fv: -16%  
Valuation momentum (fwd 1 Yr):  3%  
Volatility margin of error +/-):  35%               

为PDO应用标准SQL语法的任何线索以及在此实例中PDO可能存在问题的任何想法都会非常有用。

评论2015年1月20日@crislar

  

我通过分支为另一个应用程序编写的原始SQL来修复此问题,以便为作为JSON输出的所有数据强加标签。我使用了字母a-f,可以在AS

之后看到

这是修订后的SQL

<?php
include("dbconfig.inc.php");
header("Content-type: application/json");

$code_wyt = $_POST['code_wyt'];

$sth = $dbh->prepare ("SELECT
    CONCAT(sc.CoName, ' (', sc.code_wyt, ')') AS 'a',
IF (
    sc.currency_shares = '£',
    CONCAT(
        'Last price:  ',
        FORMAT(
            @price2 := (
                SELECT
                    price_close
                FROM
                    stock_prices_daily
                WHERE
                    code_wyt = :code_wyt
                ORDER BY
                    date DESC
                LIMIT 1
            ),
            0
        ),
        'p'
    ),
    CONCAT(
        'Last price:  ',
        sc.currency_shares,
        FORMAT(
            @price2 := (
                SELECT
                    price_close
                FROM
                    stock_prices_daily
                WHERE
                    code_wyt = :code_wyt
                ORDER BY
                    date DESC
                LIMIT 1
            ),
            1
        )
    )
) AS 'b',
IF (
    sc.currency_shares = '£',
    CONCAT(
        'WYT fair value (npv):  ',
        FORMAT(
            @price3 := (
                SELECT
                    npv_adj
                FROM
                    companies_monthly
                WHERE
                    code_wyt = :code_wyt
                AND date_monthly >= CURDATE()
                AND MONTH (date_monthly) = MONTH (CURDATE())
                ORDER BY
                    date_monthly
                LIMIT 1
            ),
            0
        ),
        'p'
    ),
    CONCAT(
        'WYT fair value (npv):  ',
        sc.currency_shares,
        FORMAT(
            @price3 := (
                SELECT
                    npv_adj
                FROM
                    companies_monthly
                WHERE
                    code_wyt = :code_wyt
                AND date_monthly >= CURDATE()
                AND MONTH (date_monthly) = MONTH (CURDATE())
                ORDER BY
                    date_monthly
                LIMIT 1
            ),
            0
        )
    )
) AS 'c',
 CONCAT(
    'Upside to WYT fv: ',
    ROUND(((@price3 /@price2) - 1) * 100, 0),
    '%'
) AS 'd',
 (
    SELECT
        CONCAT(
            'Valuation momentum (fwd 1 Yr):  ',
            ROUND((a.npv_adj / b.npv_adj - 1) * 100, 0),
            '%'
        )
    FROM
        companies_monthly a,
        companies_monthly b
    WHERE
        a.code_wyt = b.code_wyt
    AND a.code_wyt = :code_wyt
    AND b.date_monthly >= CURDATE()
    AND a.date_monthly >= DATE_ADD(CURDATE(), INTERVAL 1 YEAR)
    ORDER BY
        a.date_monthly,
        b.date_monthly
    LIMIT 1
) AS 'e',
 (
    SELECT
        CONCAT(
            'Volatility margin of error +/-):  ',
            FORMAT(
                margin_of_error_valuation * 100,
                0
            ),
            '%'
        )
    FROM
        MoE_valuation
    WHERE
        code_wyt = :code_wyt
    AND sample_period_yrs = '10'
    LIMIT 1
) AS 'f',   
 'null',
 'null',
 'null',
 'null'
FROM
    stock_codes sc,
    stock_prices_daily spd
WHERE
    sc.code_wyt = spd.code_wyt
AND sc.code_wyt = :code_wyt
ORDER BY
    spd.date
LIMIT 1");
$sth->bindParam(':code_wyt', $code_wyt, PDO::PARAM_STR, 12);
$sth->execute();
$result=$sth->fetchALL(PDO::§);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
echo json_encode($result);
?>

喝彩!

C

2 个答案:

答案 0 :(得分:1)

我在原帖中修改后的代码中修正了这个问题。 问题是原始的sql查询是从MySQL中保存的数据写入Excel中的输出空行。

如果没有标签,PDO中的JSON编码似乎会忽略数据。

我的修复是在这种情况下使用字母a-f添加标签,以便JSON解析器获取数据并将其输出为JSON。

原始SQL输出结尾的其他三个空行我不需要,所以我用NULL来标记这些。我可能会更改它以删除它们,因为它们在最终生产版本中不需要。

感谢艾哈迈德,他回答了一些有趣的想法和代码片段,我一定会记住这些。通过其他人的代码来看是非常困难的,所以给予那些给予它的人带来的荣誉。

C

答案 1 :(得分:0)

您需要调整脚本以使其具有唯一的占位符名称:code_wyt1:code_wyt2:code_wyt3等等......

然后绑定每个参数保持相同的值:

$sth->bindParam(':code_wyt1', $code_wyt, PDO::PARAM_STR, 12);
$sth->bindParam(':code_wyt2', $code_wyt, PDO::PARAM_STR, 12);
$sth->bindParam(':code_wyt3', $code_wyt, PDO::PARAM_STR, 12);

然后它应该工作,你没有看到错误的可能原因是你在查询结束时设置错误模式我建议你和连接一起做,否则为时已​​晚。 / p>

请注意,可以使其与PDO emulation enabled一起使用。 其他建议是将查询移动到存储过程,不仅会减少代码量,还可以帮助您维护查询而无需触及PHP脚本。


error_reporting(E_ALL);
ini_set("display_errors", 1);
header("Content-type: application/json");
$result = array();
if(isset($_POST['code_wyt'])){
    $code_wyt = $_POST['code_wyt'];
    $dbh = new PDO('xxxxxxx');
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

    if($sth = $dbh->prepare ("...")){
        $sth->bindParam(':code_wyt1', $code_wyt, PDO::PARAM_STR, 12);
        $sth->bindParam(':code_wyt2', $code_wyt, PDO::PARAM_STR, 12);
        $sth->bindParam(':code_wyt3', $code_wyt, PDO::PARAM_STR, 12);
        ....
        if($sth->execute()){
            $result=$sth->fetchAll(PDO::FETCH_ASSOC);
        }else{
            $result = array('error'=>'failed to execute');      
        }

    }else{
        $result = array('error'=>'failed to prepare');
    }
}else{
    $result = array('error'=>'missing code');
}
echo json_encode($result);