【问题标题】:PHP Mysqli->query() returns false for SELECT INNER JOIN, Mysqli->error returns emptyPHP Mysqli->query() 为 SELECT INNER JOIN 返回 false,Mysqli->error 返回空
【发布时间】:2018-11-29 01:23:31
【问题描述】:

编辑:添加当前正在使用的数据

我创建了一个小的函数文件,作为数据库接口,用于以简单的方式处理查询。

// Run SQL query
function runSQLQuery($sql) {
    // Open DB
    $db = connectToDB();

    if( $db->connect_errno ) {
        $data['response'] = false;

        $data['error_code'] = $db->connect_errno;

        $data['error'] = $db->connect_error;

        return $data;
    }

    // Run & return query
    $response = $db->query($sql);

    if( is_bool($response) ) {
        $response = ($response) ? 'true' : 'false';
    }

    switch($response) {
        case "true":
            $data['raw'] = $response;

            $data['response'] = true;

            $data['error'] = null;

            $data['id'] = $db->insert_id;

            return $data;

        case "false":
            $data['raw'] = $response;

            $data['response'] = false;

            $data['error_code'] = $db->errno;

            $data['error'] = $db->error;

            return $data;

        default:
            $data['raw'] = $response;

            $data['response'] = true;

            $data['error'] = null;

            if( $response->num_rows > 0) {
                while( $row = $response->fetch_assoc() ) {
                    $data['data'][] = $row;
                }
            }
            else {
                $data['data'] = null;
            }

            return $data;
    }
}

// Open database connection
function connectToDB() {
    // Connect to DB
    return new mysqli(
        DB_SERVER,
        DB_USER,
        DB_PASS,
        DB_NAME
    );
}

在大多数情况下,我会在其他地方构建一个 SQL 查询并将其传递给这个 runSQLQuery 函数,然后将响应作为 JSON 回显给我的网络应用程序。

我对简单的 SELECT、UPDATE、DELETE 命令没有任何问题,都可以成功运行。但是我想为一个函数实现一些稍微复杂的东西,一个 SELECT INNER JOIN 查询。构建此查询并执行的函数是:

public function get($args) {
    extract($args);

    // Get event
    if(isset($userId)) {
        $sql =
        "SELECT j.id, j.event_address as address, j.event_datetime as datetime, j.event_note as note, j.event_price as price, j.client_id as userId, j.client_card_id as cardId, GROUP_CONCAT(p.event_package_id) as packages             
        FROM nr_jobs as j 
        INNER JOIN nr_job_packages as p ON p.event_id = j.id 
        WHERE j.client_id = $userId
        GROUP BY j.id;";
    }
    if(isset($jobId)) {
        $sql =
        "SELECT j.id, j.event_address as address, j.event_datetime as datetime, j.event_note as note, j.event_price as price, j.client_id as userId, j.client_card_id as cardId, GROUP_CONCAT(p.event_package_id) as packages             
        FROM nr_jobs as j 
        INNER JOIN nr_job_packages as p ON p.event_id = j.id 
        WHERE j.id = $jobId
        GROUP BY j.id;";
    }

    $events = runSQLQuery($sql);
    $events["sql"] = $sql;

    return $events;
}

由于某种原因,运行此特定查询返回 false。我在我的网络应用程序上收到的 JSON 输出是

{
  "raw": "false",
  "response": false,
  "error_code": 0,
  "error": "",
  "sql": "SELECT j.id, j.event_address as address, j.event_datetime as datetime, j.event_note as note, j.event_price as price, j.client_id as userId, j.client_card_id as cardId, GROUP_CONCAT(p.event_package_id) as packages FROM nr_jobs as j INNER JOIN nr_job_packages as p ON p.event_id = j.id WHERE j.client_id = 1 GROUP BY j.id;"
}

如果我直接运行此查询,我实际上会得到正确的结果,几行数据的包的 CONCAT 列为 1、2、3,正如预期的那样。

数据库结构:

CREATE TABLE IF NOT EXISTS nr_jobs(
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    event_address TEXT NOT NULL,
    event_datetime DATETIME NOT NULL,
    event_note TEXT,
    event_price DECIMAL(13,4) NOT NULL,
    client_id BIGINT NOT NULL,
    client_card_id BIGINT NOT NULL,
    FOREIGN KEY (client_id) REFERENCES nr_clients(id),
    FOREIGN KEY (client_card_id) REFERENCES nr_payment_cards(id)
);

CREATE TABLE IF NOT EXISTS nr_job_packages(
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    event_package_id BIGINT NOT NULL,
    event_id BIGINT NOT NULL,
    FOREIGN KEY (event_id) REFERENCES nr_jobs(id) ON DELETE CASCADE,
    FOREIGN KEY (event_package_id) REFERENCES nr_packages(id) ON DELETE CASCADE
);

查询的输出直接运行:

+----+-------------------------------------------- ------------------------------------------------+-------------- --------+------+------------+--------+--------+----- -----+ |编号 |地址 |日期时间 |注意 |价格 |用户名 |卡号 |包| +----+-------------------------------------------- ------------------------------------------------+-------------- --------+------+------------+--------+--------+----- -----+ | 1 | SIM HQ LT3.02A, 461 Clementi Rd, Singapore, South West 59, 新加坡 | 2018-11-28 10:38:00 | | 320.0080 | 1 | 3 | 2,3 | | 2 | Tay Eng Soon Library, Blk A, SIM HQ, Singapore, South West 59, 新加坡 | 2018-11-28 10:42:00 | | 320.0080 | 1 | 3 | 2,3,4 | | 3 | SIM HQ 公司办公室,461 Clementi Rd, Singapore, South West 59, Singapore | 2018-11-28 10:43:00 | | 1020.0000 | 1 | 3 | 1,2,3,4 | | 4 | L.A. City DOT, 洛杉矶, 加利福尼亚州 90012, 美国 | 2018-11-28 12:15:00 | | 860.0000 | 1 | 4 | 2,3,4 | +----+-------------------------------------------- ------------------------------------------------+-------------- --------+------+------------+--------+--------+----- -----+

如果查询没有问题,并且其他查询在我的函数中工作,为什么这个特定的 SELECT INNER JOIN 查询失败且没有错误?

编辑:

nr_jobs 数据:

SELECT * FROM nr_jobs;

+----+-------------------------------------------- ------------------------------------------------+-------------- -------+------------+-------------+-----------+--- -------------+ |编号 |事件地址 |事件日期时间 |事件注释 |事件价格 |客户 ID | client_card_id | +----+-------------------------------------------- ------------------------------------------------+-------------- -------+------------+-------------+-----------+--- -------------+ | 1 | SIM HQ LT3.02A, 461 Clementi Rd, Singapore, South West 59, 新加坡 | 2018-11-28 10:38:00 | | 320.0080 | 1 | 3 | | 2 | Tay Eng Soon Library, Blk A, SIM HQ, Singapore, South West 59, 新加坡 | 2018-11-28 10:42:00 | | 320.0080 | 1 | 3 | | 3 | SIM HQ 公司办公室,461 Clementi Rd, Singapore, South West 59, Singapore | 2018-11-28 10:43:00 | | 1020.0000 | 1 | 3 | | 4 | L.A. City DOT, 洛杉矶, 加利福尼亚州 90012, 美国 | 2018-11-28 12:15:00 | | 860.0000 | 1 | 4 | +----+-------------------------------------------- ------------------------------------------------+-------------- -------+------------+-------------+-----------+--- -------------+

nr_job_packages

SELECT * FROM nr_job_packages;

+----+------------------+----------+ |编号 | event_package_id | event_id | +----+------------------+----------+ | 1 | 2 | 1 | | 2 | 3 | 1 | | 3 | 2 | 2 | | 4 | 3 | 2 | | 5 | 4 | 2 | | 6 | 1 | 3 | | 7 | 2 | 3 | | 8 | 3 | 3 | | 9 | 4 | 3 | | 10 | 2 | 4 | | 11 | 3 | 4 | | 12 | 4 | 4 | +----+------------------+----------+

【问题讨论】:

  • nr_job_packages 中有数据吗?
  • @MarcoPens 在编辑中添加。数据就在那里,并且可以通过直接查询正确检索。

标签: php mysql mysqli


【解决方案1】:

答案:之前的函数有错别字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多