我发现在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
答案 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);