2013-04-17 3 views
-1

В основном я использую оболочку mySQLi, которую я нашел в сети, и, пытаясь ее использовать, я столкнулся с проблемой, которую я не вижу, чтобы пройти, в основном, я выполняю это.Выполнение запроса внутри массива активных строк

<?php 
    $res = $DB->Query("SELECT * FROM `table`"); 
    while($row = $DB->Fetch()) { 
?> 
<tr> 
    <td><?php echo $row['id']; ?></td> 
    <td><?php echo $functions->checkStatus($row['arowhere']); ?></td> 
</tr> 
<?php 
     } 
?> 

Так что, когда я пытаюсь сделать это $functions->checkStatus($row['arowhere']);выполняет новый запрос внутри этой функции на моей строке таблицы, это изменяя последний запрос, который используется для while($row = $DB->Fetch()) {

public function Query($SQL) { 
     $this->SQL = $this->mysqli->real_escape_string($SQL); 
     $this->Result = $this->mysqli->query($SQL); 

     if ($this->Result == true) { 
      return true; 
     } else { 
      die('Problem with Query: ' . $this->SQL); 
     } 
} 

public function Fetch() { 
    return mysqli_fetch_assoc($this->Result); 
} 

Есть ли решение или, может быть, кто-то укажет меня в правильном направлении, поэтому я могу избежать этого.

+1

Да, не использовать оболочку, как это .. Там нет абсолютно никаких причин, чтобы использовать это, простые PDO/Mysqli объектов делает то же самое, не все головные боли .. – dbf

+0

@dbf, поэтому вы бы порекомендовали мне перекодировать мое полное приложение? –

+0

Я рекомендую не использовать накладные расходы;) Если это связано с перекодировкой приложения, то это зависит от вас. Просто напишите небольшое справочное руководство. Один небольшой код этого примера с вашим классом-оболочкой и один пример с простой функцией mysqli. Если класс-оболочка не добавляет никаких преимуществ (но недостатков), то вы знаете свой выбор;) – dbf

ответ

1

Я не могу поверить, что такую ​​обертку можно найти в Интернете. По сути, это полностью, в конечном счете непригодным для использования.

Выполнение mysqli->real_escape_string($SQL); не имеет абсолютно никакого смысла. Он не защитит ваш запрос от инъекций, но он испортит любой сложный запрос. Как только вы попытаетесь запустить запрос с условием WHERE, он умрет от ошибки.

И следующая строка тоже неправильно

die('Problem with Query: ' . $this->SQL); 

, как это не показывая ни ошибки, ни файла и номер строки.

И мере проблема Этой оболочки является одним вы сталкиваетесь - это с помощью внутренней переменных для хранения результата, в то время как он должен просто возвращения это.

A real mysqli wrapper is SafeMysql, который позволяет добавлять любые динамические данные через заполнители.

С SafeMysql ваш код будет работать:

<?php 
    $res = $DB->query("SELECT * FROM `table`"); 
    while($row = $db->fetch($res)) { 
?> 
<tr> 
    <td><?php echo $row['id']; ?></td> 
    <td><?php echo $functions->checkStatus($row['arowhere']); ?></td> 
</tr> 
<?php 
     } 
?> 
0

Вы можете перебирать строки и добавлять их во временный массив. Затем вы можете ссылаться на строки через этот массив после того, как были сделаны другие запросы. Это может иметь последствия для памяти, если слишком много строк возвращаются запросом, поэтому будьте осторожны.

<?php 
$res = $DB->Query("SELECT * FROM `table`"); 

$rows = array(); 
while($row = $DB->Fetch()) { 
    array_push($rows, $row); 
} 

foreach($rows as $row){ 
?> 
    <tr> 
     <td><?php echo $row['id']; ?></td> 
     <td><?php echo $functions->checkStatus($row['arowhere']); ?></td> 
    </tr> 
<?php 
} 
unset($rows); // destroys the temporary array, freeing the memory it consumed 
?> 
Смежные вопросы