Циклы PHP работают на локальном хосте, но на сервере - PullRequest
2 голосов
/ 27 марта 2019

У меня странная проблема.Я прочитал все связанные темы, но не было никакого решения для меня.В моем проекте есть несколько php-кодов, и все они работают отлично, но вот один:

<?php
    require("connection.php");
    $query = "SELECT * FROM mrf WHERE completed=0 AND archive IS NULL ORDER BY projectname";
    $get = $db->prepare($query);
    $get->execute();
    if ($get->rowCount()!=0){
    foreach ($get as $res) {
      '<li class="list-group-item"><span class="font-weight-bold">Product(s) : </span>';
      $pieces = explode(",", $res['products']);
      $pieces_count = count($pieces);
      for ($i=0; $i <= $pieces_count -1 ; $i++) { 
        $query2 = "SELECT * FROM suppliers WHERE id = :id";
        $get2 = $db->prepare($query2);
        $get2->bindValue(":id",$pieces[$i]);
        $get2->execute();
        if ($get2->rowCount()!=0){
          foreach ($get2 as $res2) {
            echo $res2['name'].'<b>/</b>';
          }
       }
    }       
    echo '</li>';

Он отлично работает на localhost, но на сервере результат пуст.

  • Я проверил ошибки (я)

     error_reporting(E_ALL);
     ini_set('display_errors', 1);
    

Но ошибки нет.Также, если бы произошла ошибка, я бы увидел ее на localhost, потому что error_reporting работает как на локальном, так и на живом сервере.

  • Я проверил опечатки, никаких опечаток нет
  • Проверил cpanel все, что связано с PHP.Все нормально.Кстати, php вер 5,6

  • Есть идеи ??

----------------------------------- РЕЗУЛЬТАТ ----------------------------

-Я снова проверил все коды и не нашел ошибок.-Я связался с моей хостинговой компанией.Они сказали, что мой сервер достиг RLimitMEM (не знаю, что это такое), поэтому они увеличили мое значение RlimitMEM.- Я не удовлетворен ответом хостинговой компании, но код работает.- Я ценю за все ответы и советы.

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Попробуйте повторить это:

foreach ($get as $res) {
  '<li class="list-group-item"><span class="font-weight-bold">Product(s) : </span>';

Что-то там пропало, нет?

foreach ($get as $res) {
  echo '<li class="list-group-item"><span class="font-weight-bold">Product(s) : </span>';

Иногда это простые вещи.

Обратите внимание, что PHP прекраснохорошо, когда определена бесполезная строка:

'foo';

Песочница

Не будет на это жаловаться.Для других языков это может быть проблемой, но PHP очень отказоустойчив (иногда даже слишком).

PS require("connection.php"); не является функцией, хотя он будет работать с () это считается плохой практикой.Вместо require "connection.php"; работает нормально.Это помогает отличить его от функции, когда вы смотрите на код.

Вам также следует немного переместить это:

foreach ($get as $res) {   
   //...
  for ($i=0; $i <= $pieces_count -1 ; $i++) { 
    $query2 = "SELECT * FROM suppliers WHERE id = :id";
    $get2 = $db->prepare($query2);
    $get2->bindValue(":id",$pieces[$i]);
    $get2->execute();

И сделать это так:

$query2 = "SELECT * FROM suppliers WHERE id = :id";
$get2 = $db->prepare($query2);

foreach ($get as $res) {   
   //...
  for ($i=0; $i <= $pieces_count -1 ; $i++) { 
     $get2->execute(['id'=>$pieces[$i]]); //instead of binding, you can just do it in execute too

И делать Prepare вне цикла, это улучшит производительность в большинстве случаев.Каждый раз, когда вы выполняете команду Prepare, БД используется для компиляции инструкций запроса, затем при ее выполнении отправляются только данные.Вот как они побеждают SQl Injection, потому что SQL и DATA обрабатываются отдельно.

Итак, подготавливая его в цикле, вы запрашиваете у БД ненужную работу.Формат SQL не меняется в расчете на цикл, только данные.Для этого существует только необходимость execute запроса для каждой итерации.

Наконец:

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

1 голос
/ 27 марта 2019

Замените ваш код следующим и проверьте

<?php
require("connection.php");
$query = "SELECT * FROM mrf WHERE completed=0 AND archive IS NULL ORDER BY projectname";
$get = $db->prepare($query);
$get->execute();
if ($get->rowCount()!=0){
foreach ($get as $res) { ?>
  '<li class="list-group-item"><span class="font-weight-bold">Product(s) : 
</span>';
  <?php 
  $pieces = explode(",", $res['products']);
  $pieces_count = count($pieces);
  for ($i=0; $i <= $pieces_count -1 ; $i++) { 
    $query2 = "SELECT * FROM suppliers WHERE id = :id";
    $get2 = $db->prepare($query2);
    $get2->bindValue(":id",$pieces[$i]);
    $get2->execute();
    if ($get2->rowCount()!=0){
      foreach ($get2 as $res2) {
        echo $res2['name'].'<b>/</b>';
      }
    }
  }
  echo '</li>';
 }
}

Вы не закрыли PHP, закрывающих фигурных скобок там не было ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...