2016-02-21 3 views
1

Мой код php работает нормально, когда он не является prepared statement. Однако, когда это подготовленное заявление, оно дает мне json malformed error. После отладки моего кода в течение некоторого времени я понял, что что-то не так с моим оператором if и что он должен быть другим, когда он равен prepared statement. Я не уверен, что нужно изменить, но это мой код:php Подготовлено заявление, дающее мне JSON Malformed

$statement = "SELECT userID, forename, surname, email, age FROM employees WHERE forename = ?" 
$outcome = $conn -> prepare($statement); 
$outcome->bind_param('s', $forename); 
$outcome->execute(); 
$outcome->close(); 
$outcomearray = array(); 
echo json_encode("It works as of now"); // This bit works and the message is echoed 

// From this point, it is giving me errors and problems 
if(mysqli_num_rows($outcome)){ 
    while($line = mysqli_fetch_assoc($outcome)){ 
     $outcomearray[] = array 
     (
      "userID" => $line["userID"], 
      "forename" => $line["forename"], 
      "surname" => $line["surname"], 
      "username" => $line["username"], 
      "email" => $line["email"], 
      "age" => $line["age"] 
     ); 
    } 
    echo json_encode($outcomearray); 
} 

Это следующие две строки:

if(mysqli_num_rows($outcome)){ 
     while($line = mysqli_fetch_assoc($outcome)){ 

, что я считаю, дают ошибки.

Как исправить это?

+0

Вы удалили это 'эхо json_encode ("Он работает как сейчас");' и попробовал еще раз? –

+0

У меня есть и я получаю 'Malformed JSON: Неожиданный '<''. Я считаю, что это оператор 'if' –

+0

Закройте соединение в конце вашего скрипта вместо того, чтобы извлекать строки. – max

ответ

1
$stmt = $conn->prepare(
    "SELECT userID, forename, surname, email, age FROM employees WHERE forename = ?" 
); 
$stmt->bind_param('s', $forename); 
$stmt->execute(); 
$rows = array(); 
$result = $stmt->get_result(); 

while($line = $result->fetch_assoc()){ 
    $rows[] = $line; 
} 

print json_encode($rows); 

$conn->close(); 

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

Если по каким-то причинам нужно вы можете получить количество строк из num_rows собственности на mysqli_result объекта:

$result = $stmt->get_result(); 

if ((bool) $result->num_rows) { 

} 

Также отметим, что вся суть FETCH_ASSOC, чтобы получить ассоциативный массив. Поэтому, если имена столбцов совпадают с JSON, которые вы хотите создать, нет необходимости сопоставлять ключи один за другим.

+0

Извините, за беспорядок и многие изменения. Все еще ждут, когда кофе начнет ... – max

+0

Работал как шарм Макс!Спасибо, что объяснили это, и поскольку я честный человек, я проголосовал и принял ваш ответ. –

-1

Использование Try

$outcome->num_rows; 

ИЛИ

mysqli_stmt_num_rows($outcome); 

использовать также

$outcome->bind_result('userID','email', 'age', 'surname', 'forename'); 
$outcome->fetch() 

вместо

mysqli_assoc_fetch() 
+0

По-прежнему не работает –

+0

Я редактирую свой ответ. Можете ли вы получить информацию об ошибке, которую вы получаете. –

+0

'assoc_fetch' и' fetch' делают очень разные вещи. – max