2015-06-15 6 views
0

Я пытаюсь проверить, какой идентификатор меньше 2 раз в поле ID_REF с кодом ниже. Его реферальная заявка, в которой идентификатор может ссылаться только на 2 направления. ПриветствияОшибка Mysql 'недопустимое использование групповой функции'

enter image description here

КОД

$stmt = $conex->prepare("SELECT id FROM tb_modules WHERE count(id_ref) < ? ORDER BY id DESC LIMIT 1"); 



         $stmt->bind_param("s", $n); 
         $n = 2; 

         $stmt->execute(); 

         $stmt->store_result(); 
         $numrows = $stmt->num_rows; 


         $stmt->bind_result($id); 

         //$stmt->fetch(); 

         $stmt->close(); 

         //echo $id.' '.'oi'; 
         while ($stmt->fetch()) { 
         echo $id; 
         } 


        } 
+0

Спасибо @showdev Я еще не нашел его. Может быть, что-то не так с моей логикой. =/ – Thecoder

+0

Вы используете MySQLi? Возможно, было бы полезно узнать, генерируются ли какие-либо сообщения об ошибках. См. [Mysqli_error] (http://php.net/manual/en/mysqli.error.php). – showdev

+0

Я бы сказал, что дескриптор $ conex должен быть помещен в 'var_dump()'. Это скажет вам, какой тип данных PHP видит в нем. –

ответ

0

Выполните следующие действия:

var_dump($conex); 
$stmt = $conex->prepare("SELECT id FROM tb_modules WHERE count(id_ref) < ? ORDER BY id DESC LIMIT 1"); 

var_dump($stmt) 

Это должно пролить свет на этот вопрос. Я уверен, что переменная $stmt имеет значение bool или null.

+0

Это очевидно. Вы могли бы опубликовать это как комментарий. Вы также должны изменить свой ответ, чтобы попытаться ответить на вопрос. То есть - 'if (! $ stmt) {echo 'ошибка ...'; } else {bind query ....} ' – Darren

+0

Я буду помнить об этом, но я думаю, что обучение надежным методам кодирования выходит за рамки. Если нет, зачем останавливаться на достигнутом? Скажите ему, чтобы установить mysqli_options так, чтобы были исключены только исключения? Затем это можно сделать с помощью try \ catch \ finally. –

+0

Помните, что вы здесь, чтобы ответить на вопрос, а не рассказывать ему, как его отлаживать ;-) Но я полностью понимаю, откуда вы. Если бы люди следовали руководству, они увидели бы, как это сделать правильно! – Darren

0

Ваш код не проверяет, успешно ли возвращается prepare.

Если произошла ошибка prepare, она возвращает FALSE. вместо объекта-оператора.

И логическое значение FALSE (возврат от prepare) не имеет способа/функции bind_param.

$stmt = $conex->prepare("..."); 
    if(!$stmt) { 
     echo "error in prepare ". mysqli_error($conex) ; 
    } else { 
     // prepare returned a statement object so we can do a bind_param 
     $stmt->bind_param(...); 

Чтобы исправить проблему синтаксиса в операторе SQL, который вызывает ошибку в подготовке, заменить их ключевое слово WHERE с ключевым словом HAVING.

Предикаты (условия) в предложении WHERE оцениваются при доступе к строкам. Таким образом, результат агрегатной функции (например, COUNT() не будет доступен в то время, когда будут проверены эти условия в WHERE. Нет возможности для этого условия оценивать до после, к которым обращаются строки, а совокупные функции оценивается. Предикаты (условия) в предложении HAVING оцениваются позже, поэтому он действителен для ссылочных агрегатов в соответствии с предложением HAVING.

Простое внесение этого изменения в инструкцию SQL вряд ли приведет к тому, что вы увидите результат для. Без спецификации мы просто догадываемся о том, что вы пытаетесь вернуть.

+0

Реализовать использование только исключений. Это более элегантно. :-) –

+0

@AnthonyRutledge: Реализовать с использованием ORM, Spring framework Java. Это более элегантно. :-) – spencer7593

+0

Будьте близки к истинным знаниям. Будь сильным. Сопротивляйте раскол. ;-) –

1

Вы не проверяете какие-либо ошибки, то есть полностью плохое развитие. Вы должны начать с обеспечения того, чтобы ваш prepare() фактически готовит запрос правильно и не подведет ...

$stmt = $conex->prepare("SELECT id FROM tb_modules WHERE count(id_ref) < ? ORDER BY id DESC LIMIT 1"); 
// now check 
if(!$stmt) { 
    die($conex->error); // or mysqli_error($conex); 
} else { 
    $stmt->bind_param('s', $n); 
} 

Назад к другим вопросам. Вы, кажется, пытается сравнить count(id_ref), который был бы ряд (int) против $n (который является int слишком), но вы пытаетесь передать его в виде строки .....?

Вам нужно изменить эту привязку твоего, чтобы что-то вроде:

$stmt->bind_param('i', $n); 

Также обратите внимание, что вы не можете установить переменную $n после вызова его .... что собирается бросить ошибку ,

Смежные вопросы