Почему переменные подготовленного оператора не являются обязательными?

#php #mysql #prepared-statement

Вопрос:

Я написал запрос, используя поле SQL в phpMyAdmin (мой инструмент выбора), и запрос работает хорошо. Теперь я пришел, чтобы загрузить это на страницу PHP, и, используя приведенное ниже, я получаю нулевые результаты.

 echo $_SESSION['ownerAC']; // 2
echo $_SESSION['versionNo']; // 1    

if ($stmt = $con->prepare("SELECT node.id, node.line_type, (COUNT(parent.id) - 1) AS depth,
        node.visible_index, node.printed_no, node.line_text, node.value_type, node.left_index,
        node.right_index,
        (SELECT COUNT(*) FROM bk_accounts a WHERE a.balance_and_income_line_id = node.id)
        FROM bk_balance_and_income_lines AS parent
        LEFT JOIN bk_balance_and_income_lines AS node ON node.left_index
                BETWEEN parent.left_index AND parent.right_index 
                WHERE node.ownerID = ? AND node.version_no = ? AND parent.ownerID = node.ownerID AND parent.version_no = node.version_no
        GROUP BY node.id ORDER BY node.left_index")) {
        
            $stmt->bind_param('ii', $_SESSION['ownerAC'], $_SESSION['versionNo']);
            
            $stmt->execute();
        
            $tAccountQ = $stmt->get_result();   
            
            $tAccountList = $tAccountQ->fetch_all(MYSQLI_ASSOC); }
 

Однако, если я «жестко закодирую» переменные, в данном случае » 2 » и » 1 » в моем запросе, я получу полный набор результатов.

Есть ли причина, по которой это не должно сработать? Или я веду себя немного глупо?

Если я введу следующее в командную строку или консоль phpMyAdmin SQL, я получу результаты:

 SELECT node.id, node.line_type, (COUNT(parent.id) - 1) AS depth,
        node.visible_index, node.printed_no, node.line_text, node.value_type, node.left_index,
        node.right_index,
        (SELECT COUNT(*) FROM bk_accounts a WHERE a.balance_and_income_line_id = node.id)
        FROM bk_balance_and_income_lines AS parent
        LEFT JOIN bk_balance_and_income_lines AS node ON node.left_index
                BETWEEN parent.left_index AND parent.right_index 
                WHERE node.ownerID = '2' AND node.version_no = '1' AND parent.ownerID = node.ownerID AND parent.version_no = node.version_no
        GROUP BY node.id ORDER BY node.left_index
 

Редактировать: теперь он выдает эту ошибку:

 PHP Fatal error:  Uncaught mysqli_sql_exception: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'contract_contractr.node.line_type' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by in /home/coop/pages/chartOfAccounts.php:12
Stack trace:
#0 /home/coop/pages/chartOfAccounts.php(12): mysqli->prepare('SELECT node.id,...')
#1 /home/coop/coxxxxxxxxxxx.com/index.php(140): include('/home/coop...')
#2 {main}
  thrown in /home/coop/pages/chartOfAccounts.php on line 12
 

Что меня больше смущает, так как я не получаю ту же ошибку (или любую ошибку, я просто получаю результаты), когда в phpMyAdmin, или когда ? и ? заменяются на «2» и «1»

Комментарии:

1. Обычно это переменные сеанса, но для удобства отображения здесь я просто использовал два целых числа, которые хранятся в переменных сеанса и должны привести к результату — никаких ошибок не отображается, он просто возвращается к результату. мой журнал ошибок пуст.

2. Попробуйте использовать 'ss' вместо этого. Я помню, что в MySQL была ошибка, может быть, вы тоже ее нашли.

3. «сс» тоже не приносит радости. Ничего не возвращается.

4. Попробуй $stmt->bind_param('ss', ...[2,1]); и скажи мне, что ты получишь

5. Вообще ничего, никакой ошибки, все равно, запись не возвращена, но как будто это правильный запрос. Я так озадачен этим.