从服务器PHP脚本提取股票价格JSON遇错,求解决方案
解决方案:修复JSON解析错误、CORS及404问题
1. 解决JSON解析错误(核心问题)
你的PHP脚本输出了非JSON内容(Connected successfully、股票详情文本),这些内容会和JSON字符串混在一起,导致前端无法正常解析。要彻底解决这个问题,需要确保PHP只返回纯JSON数据:
修改后的PHP代码:
<?php /* 1. 先设置CORS和JSON响应头,必须在任何输出之前 */ header("Access-Control-Allow-Origin: https://www.dividendlook.co.uk"); // 生产环境限制为你的域名,更安全 header("Content-Type: application/json; charset=utf-8"); /* Loads the WordPress environment and template */ require( '../../wp-blog-header.php' ); global $current_user; wp_get_current_user(); // DataTables PHP library include( "../lib/DataTables.php" ); $json_array = array(); $stock_id = 709; // CTY.LSE try { $pdo = new PDO(strtolower($sql_details['type']) . ":host=" . $sql_details['host'] . ";dbname=" . $sql_details['db'], $sql_details['user'], $sql_details['pass']); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 移除调试用的echo语句,避免输出非JSON内容 } catch(PDOException $e) { // 错误信息也返回JSON格式,避免前端解析失败 echo json_encode(array("error" => "Connection failed: " . $e->getMessage())); exit; // 终止脚本,避免后续无效输出 } $result = $pdo->query("SELECT id, symbol, name, price FROM dm_stocks WHERE id = $stock_id"); foreach ($result as $row) { // 移除所有调试用的股票详情echo array_push( $json_array, array('symbol'=>$row['symbol'], 'price'=>$row['price'] ) ); } // 只输出纯JSON数据 echo json_encode($json_array); ?>
关键改动说明:
- 把
header()放在最顶部,确保在任何输出(包括空格、注释)之前发送 - 移除所有调试用的
echo语句,只保留json_encode的输出 - 异常处理时也返回JSON格式的错误信息,避免前端解析失败
2. 彻底解决CORS问题
如果用.htaccess解决,确保规则正确(放在WordPress默认规则之前):
<IfModule mod_headers.c> Header set Access-Control-Allow-Origin "https://www.dividendlook.co.uk" Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" Header set Access-Control-Allow-Headers "Content-Type" </IfModule>
注意:生产环境不要用
*,限制为你的具体域名更安全。如果用PHP的header()设置,要确保没有其他输出(比如WordPress的主题/插件可能提前输出内容,这时候用.htaccess更可靠)。
3. 修复404问题
404错误通常是路径或服务器规则导致的:
- 确认PHP文件的实际路径:直接在浏览器访问
https://dividendlook.co.uk/Editor-PHP-1.9.0/controllers/ajax_stock_holdings1.php,检查是否能正常返回JSON - 检查WordPress的
.htaccess重写规则:如果Editor-PHP目录在WordPress根目录内,可在该目录下新建.htaccess文件,添加RewriteEngine Off禁用重写,避免WordPress接管请求 - 检查文件权限:确保PHP文件权限为
644,目录权限为755,服务器能正常读取该文件
4. 适配DataTables的前端代码示例
修复后端后,前端可以直接把数据整合到DataTables中:
<script> $(document).ready(function() { $.ajax({ url: "https://dividendlook.co.uk/Editor-PHP-1.9.0/controllers/ajax_stock_holdings1.php", dataType: "json", success: function(data) { // 假设你的表格id为stockTable $('#stockTable').DataTable({ data: data, columns: [ { data: 'symbol', title: '股票代码' }, { data: 'price', title: '当前价格' } ] }); }, error: function(xhr, status, error) { console.error("请求失败:", error); console.log("响应内容:", xhr.responseText); } }); }); </script>
用jQuery的
$.ajax比原生XMLHttpRequest更简洁,也更适配DataTables的生态。
内容的提问来源于stack exchange,提问作者colin
相关产品推荐
相关产品推荐

