Использование переменных, заменяющих операторы выбора SQL и операторы PHP Prepare. Где я ошибся?

У меня есть рабочий код, в котором используется оператор выбора SQL. Как статический фрагмент кода, он отлично работает, однако я хочу иметь возможность использовать в нем переменные. Итак, проводя мое исследование, все говорят, что вы должны использовать операторы PHP Prepare, чтобы все было в безопасности. Итак, мой старый код выглядит примерно так:

    /*** MY OLD WORKING CODE ***/ 
    /*** SQL Query ***/   
    $sql = "SELECT tickets.ref AS `Ticket Number` ......
    .....BLAH................INTERVAL 30 DAY) AND 
    organizations.name = 'NAMEIWANTTOUSE' ";

    /*** For Each Loop to Build Table ***/
    foreach ($dbh->query($sql) as $row){ 
     echo "<tr>"; 
      echo "<td bgcolor=89FF95 align=center>".$row['Ticket Number']."</td>"; 
       ETC..................
    } 
    $sql->closeCursor();

Мой новый код, который я пытаюсь заставить работать ... кажется, ничего не делает. Я знаю, что я не слишком далеко зашел с этим, но я просто не могу понять, какую переменную я должен вставить в мой цикл FOREACH ... или я действительно правильно понял инструкцию PHP Prepare?

Есть какие-нибудь предложения?

    /*** MY NEW NOT WORKING CODE ***/ 
    /*** Variables ***/
    $NAME = 'NAMEIWANTTOUSE';
    $DAYS = '30';

    /*** Prepare the SQL Query ***/
    $stmt = $sql->prepare("SELECT tickets.ref AS `Ticket Number` .......
    ....BLAH................INTERVAL :DAYS DAY) AND
    organizations.name = :NAME ");

    $stmt->bindParam(":DAYS", $DAYS);
    $stmt->bindParam(":NAME", $NAME);
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $stmt->execute();

    /*** Put each return from SQL into a Variable? ***/
    $MySQLQuery = $stmt->fetchAll();

    /*** For Each Loop to Build Table ***/
    foreach ($dbh->query($MySQLQuery) as $row){ 
     echo "<tr>"; 
      echo "<td>".$row['Ticket Number']."</td>"; 
       ETC..................
    } 
    $sql->closeCursor();

Спасибо


person Will    schedule 06.10.2012    source источник


Ответы (1)


Он почти у вас есть, за исключением того, что вы не должны вызывать query() в цикле. Набор результатов уже загружен в $MySQLQuery. fetchAll() возвращает 2D-массив, в отличие от старого mysql_query(), который возвращал ресурс результата, который требовал быть зацикленным с mysql_fetch_*().

// Following fetchAll(), $MySQLQuery is a 2D array containing your rowset.
foreach ($MySQLQuery as $row){ 
 echo "<tr>"; 
  echo "<td>".$row['Ticket Number']."</td>"; 
   ETC.........
} 
person Michael Berkowski    schedule 06.10.2012
comment
Привет Майкл. Спасибо за это. Я попытался изменить свой код, но он все еще не работает. Оператор SQL точно такой же, за исключением: NAME и: DAYS. Фактический исходный параметр использует «NAMEIWANTTUSE» (обратите внимание на кавычки) .. так что мне нужно что-то там сделать, чтобы: NAME работало? Кроме того, bindparam, я также вижу, что вам может потребоваться указать значение String? Короче новый код дает мне пустой экран .. старый код возвращает результаты. Есть предложения по отладке? Спасибо - person Will; 07.10.2012
comment
Ошибка, которую я получаю, похоже, связана с переменной в моем операторе SELECT Ошибка анализа PHP: синтаксическая ошибка, неожиданный T_VARIABLE в E: \ test.php в строке 15 - person Will; 07.10.2012