PHP循环可在localhost上运行,但可在服务器上运行

时间:2019-03-27 17:53:41

标签: php loops server localhost

我有一个奇怪的问题。我阅读了所有相关主题,但是没有任何解决方案。我的项目中有一堆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在localhost以及实时服务器上都有效。

  • 我检查了错别字,没有任何错字
  • 检查了cpanel与PHP相关的所有内容。一切都OK。 php ver是5.6

  • 任何想法?

----------------------------------- 结果 ---- ------------------------

-我再次检查了所有代码,没有发现任何错误。 -我联系了我的托管公司。他们说我的服务器已经到达RLimitMEM(不知道它是什么),所以他们增加了我的RlimitMEM值。 -我对托管公司的回答不满意,但是代码现在可以正常工作。 -感谢您提供所有答案和建议。

2 个答案:

答案 0 :(得分:1)

用以下代码替换您的代码并检查

<?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,没有大括号...

答案 1 :(得分:1)

尝试回显它:

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';

Sandbox

它不会对此抱怨。对于其他语言,这可能是一个问题,但是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

然后在循环外执行“准备”,这将在大多数情况下提高性能。每次执行“准备数据库”时,都会使用该数据库来编译查询指令,然后在执行该数据库时仅发送数据。这是他们击败SQl Injection的方式,因为SQL和DATA是分开处理的。

因此,通过在Loop中进行准备,您正在向DB请求不必要的工作。 SQL的格式不会按数据/每个循环更改,而只会更改数据。因此,只需要针对每次迭代execute进行查询。

最后

您在问题代码中缺少两个结尾}}。确保修复这些语法错误。我怀疑它们只是您在本地说明代码有效的问题而已。