【问题标题】:PHP MySQL Select Length ErrorPHP MySQL选择长度错误
【发布时间】:2019-01-18 09:33:05
【问题描述】:

一个 MySQL 数据库包含 11,000 多行和 3 个已分配的列:价格、UPC 代码和描述。在同一台机器(Ubuntu 18.04)上运行 LAMP,我使用 PHP 在页面加载时抓取数据库的每一列,并将其回显到 javascript 数组中,然后用户在文本框中搜索这些数组。唯一的问题是我的查询只允许我选择 644 个项目,然后它什么都不加载。这是一个问题,因为没有显示超过 10,356 行。

php文件:

<?php
        session_start();
$conn = new mysqli($servername, $username, $password, $dbname);
    $sql = "SELECT * FROM sys.pds limit 644;";
    $result = $conn->query($sql);
    if (!$result) {
    printf("Errormessage: %s\n", mysqli_error($conn));
    }
    if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
    $pds_code[] =  $row["Code"];
    $pds_desc[] =  $row['Description'];
    $pds_prce[] =  $row["Price"];
    }
}
$sqlDesc = json_encode($pds_desc);
$sqlPrice = json_encode($pds_prce);
$sqlCode = json_encode($pds_code);
echo "pds_descs = ". $sqlDesc . ";\n";
echo "pds_codes = ". $sqlCode . ";\n";
echo "pds_Prices = ". $sqlPrice . ";\n";

?>

返回(来自 Chrome 控制台):

pds_descs = ["desc1","desc2","etc..."];
pds_codes = ["code1","code2","etc..."];
pds_Prices = ["price1","price2","etc..."];

当限制设置为 645(或删除)时,数组变为:

pds_descs = ; pds_codes = ["code1","code2","etc..."];
pds_Prices = ["price1","price2","etc..."];

变得更有趣了由于“描述”列是唯一没有收到任何内容的列,因此我尝试通过数字而不是名称来引用该列,替换

$pds_desc[] =  $row['Description'];

$pds_desc[] =  $row[0];

*0 是“描述”的正确行。不是抛出相同的输出,而是填充一个用 null 填充的小(20-30 行)数组:

pds_descs = [null,null,null,...];
pds_codes = ["code1","code2","etc..."];
pds_Prices = ["price1","price2","etc..."];

如何修复在 js 中将完整的 11,000+ 数据库加载到其数组中以消除 644 限制?我读过关于使用 Ajax 搜索客户端 - > 服务器而不是在加载时将数据库侧加载到客户端,但从未使用过它,并且觉得这仍然是一个探索的途径。我还阅读了有关增加 MySQL/PHP 内存的信息,但经过大量努力并修改了 php.ini 和 my.cnf 仍然没有发生任何事情。

【问题讨论】:

  • json_encode($pds_desc); 返回错误。在运行json_encode 函数之前尝试检查数组,看看错误在哪里。
  • 我猜你的字符无效,比如$str = "\xF0";json_encode([$str]);会返回false;
  • 一切都通过echo print_r($pds_desc); 显示,然后是$sqlDesc = json_encode($pds_desc);
  • 您有 SELECT * FROM sys.pds limit 644 限制为 644 条记录,除此之外它不会选择任何内容。如果要选择所有记录,请摆脱限制 644。
  • @FelippeDuarte 显示错误打印session_start(): Cannot send session cache limiter - headers already sent (output started at [] in []) on line []

标签: php mysql ubuntu lamp


【解决方案1】:

错误是条目 645 包含破坏 json_encode(); 的非 ASCII 字母;陈述。 为了解决这个问题,我在 MYSQL 中运行了一个查询:

SELECT *
FROM sys.pds 
WHERE Description <> CONVERT(Description USING ASCII);

这提出了一个不符合 ASCII 的条目列表(我有 8 个条目),我修改了元素正常的字母数字字符并应用了该列表。刷新 chrome 网页后,可以加载所有 11,745 行!

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 2014-06-15
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    相关资源
    最近更新 更多