【问题标题】:PHP loops works on localhost but on serverPHP循环在本地主机上工作,但在服务器上
【发布时间】:2019-08-18 09:38:55
【问题描述】:

我有一个奇怪的问题。我阅读了所有相关主题,但没有任何适合我的解决方案。我的项目中有一堆 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>';

它在本地主机上完美运行,但在服务器上结果为空。

  • 我已经检查了错误

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

但是没有任何错误。此外,如果出现错误,我会在 localhost 上看到它,因为 error_reporting 在 localhost 和实时服务器上都有效。

  • 我检查了拼写错误,没有任何拼写错误
  • 检查了与 PHP 相关的所有内容。一切正常。顺便说一句 php ver 是 5.6

  • 有什么想法吗?

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

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

【问题讨论】:

  • 你更新你的数据库信息了吗..?
  • 您的代码中存在语法错误,它使用该代码在 localhost 上运行是一个奇迹。
  • 您是否尝试过使用SELECT * FROM mrf WHERE completed='0' AND archive IS NULL ORDER BY projectname 有时需要单引号
  • 您的服务器数据库似乎缺少来自mrf 的一些记录。另外,您确定您正确复制粘贴了这一行吗? &lt;li class="list-group-item"&gt;&lt;span class="font-weight-bold"&gt;Product(s) : &lt;/span&gt;';

标签: php loops server localhost


【解决方案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,没有关闭花括号...

【讨论】:

    【解决方案2】:

    尝试呼应一下:

    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
    

    并在循环外进行准备,这将在大多数情况下提高性能。每次执行 Prepare 时,DB 都会用于编译查询指令,然后在执行时只发送数据。这就是他们击败 SQl 注入的方式,因为 SQL 和 DATA 是分开处理的。

    因此,通过在循环中进行准备,您是在要求数据库进行不必要的工作。 SQL 的格式不会改变每个/循环,只有数据会改变。因此,每次迭代只需要execute查询即可。

    最后:

    您在问题代码中缺少两个结束 }}。确保修复这些语法错误。我怀疑它们只是问题中的一个遗漏,因为您说代码在本地工作。

    【讨论】:

    • 这可能是正确的解决方案。之前的字符串只是未使用,没有显示。
    • if 和 foreach 花括号仍然没有闭合,这不是一个完整的解决方案
    • @RakeshJakhar OP 没有发布整个 if 块。您的解决方案将是不正确的 HTML,因为您有一个 foreach 循环打开许多 &lt;li&gt; 标记并且只关闭一个;最后一个。
    • @Ice76他提到“t 可以完美运行 localhost,但在服务器上结果为空。”,这意味着他发布的代码在 localhost 上运行,而不是整个代码应该更正
    • 发布问题时很容易省略最后两个}}。这个works localhost perfectly 也暗示了问题中的一个简单的错字——我还认为它在 cmets 中被很好地覆盖了。但我还是做了更新。无论如何,这不是这个问题的根源,正如我在答案中所说,忘记输出它是。其余的可能是发布问题时的简单印刷错误。
    猜你喜欢
    • 2013-04-28
    • 2016-08-04
    • 2014-01-15
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2019-07-13
    • 1970-01-01
    相关资源
    最近更新 更多