Выберите возвращаемый пустой запрос

0

Я пытаюсь выбрать данные, где acc_id

Что я получаю в своем локальном хосте: []

Однако, когда я устанавливаю конкретный acc_id я получаю правильную строку, есть что-то в моем синтаксисе?

<?php

header('Access-Control-Allow-Origin: *');

// Define database connection parameters
$hn      = 'localhost';
$un      = 'root';
$pwd     = '';
$db      = 'ringabell';
$cs      = 'utf8';

// Set up the PDO parameters
$dsn  = "mysql:host=" . $hn . ";port=3306;dbname=" . $db . ";charset=" . $cs;
$opt  = array(
                    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                    PDO::ATTR_EMULATE_PREPARES   => false,
                   );
// Create a PDO instance (connect to the database)
$pdo  = new PDO($dsn, $un, $pwd, $opt);
$data = array();


// Attempt to query database table and retrieve data
try {   
        $acc_id = $pdo->prepare('SELECT acc_id FROM account_info');
        $stmt = $pdo->prepare('SELECT p_fname, p_lname, p_condition FROM patient_info WHERE acc_id = "$acc_id"');
        $stmt->execute([$acc_id]);
        while($row = $stmt->fetch(PDO::FETCH_ASSOC))
        {
            // Assign each row of data to associative array
            $data[] = $row;
        }

  // Return data as JSON
  echo json_encode($data);
  }
 catch(PDOException $e)
{
  echo $e->getMessage();
}
?>
Теги:

1 ответ

1
Лучший ответ

Похоже, вы хотите использовать подготовленный оператор, но вместо этого выполняете свой запрос мгновенно. Если вы хотите привязать значение к вашему запросу, используйте что-то вроде этого:

$acc_id = // get the $acc_id value from somewhere you want
$stmt = $pdo->prepare('SELECT p_fname, p_lname, p_condition FROM patient_info WHERE acc_id = ?');
$stmt->execute([$acc_id]);
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
     // Assign each row of data to associative array
     $data[] = $row;
}

Пример с использованием заполнителя

Вместо выполнения вашего оператора с помощью массива params вы также можете использовать метод bindValue() или bindParam():

$stmt = $pdo->prepare('SELECT p_fname, p_lname, p_condition FROM patient_info WHERE acc_id = :acc_id');
$stmt->bindValue(':acc_id', $acc_id);
$stmt->execute();
// everything else works as previous

Разница между этими двумя методами написана в документах:

bindValue():

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

bindParam():

Привязывает переменную PHP к соответствующему заполнителю имени или вопроса в выражении SQL, который использовался для подготовки оператора. В отличие от PDOStatement :: bindValue() переменная привязана как ссылка и будет оцениваться только в момент вызова PDOStatement :: execute().

  • 1
    Вы также можете добавить пример, используя метод заполнителей с execute. Просто ему понятно, почему его использование :acc_id не работает.
  • 0
    я получил эту ошибку Recoverable fatal error: Object of class PDOStatement could not be converted to string
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню