簡體   English   中英

PHP 循環適用於本地主機但適用於服務器

[英]PHP loops works on localhost but on server

我有一個奇怪的問題。 我閱讀了所有相關主題,但沒有任何解決方案。 我的項目中有一堆 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 和實時服務器上都有效。

  • 我檢查了錯別字,沒有任何錯字
  • 檢查 cpanel 與 PHP 相關的所有內容。 一切正常。 順便說一下,php 版本是 5.6

  • 任何的想法??

-------------------------------結果-------------- --------------

- 我再次檢查了所有代碼,沒有發現任何錯誤。 - 我聯系了我的托管公司。 他們說我的服務器已經達到 RLimitMEM(不知道它是什么)所以他們增加了我的 RlimitMEM 值。 - 我對托管公司的回答不滿意,但代碼現在正在運行。 - 我感謝所有的答案和建議。

用以下代碼替換您的代碼並檢查

<?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,沒有關閉大括號...

嘗試呼應它:

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 時,都會使用 DB 來編譯查詢指令,然后在執行時僅發送數據。 這就是他們如何打敗 SQL 注入,因為 SQL 和 DATA 是分開處理的。

因此,通過在 Loop 中准備它,您是在要求 DB 進行不必要的工作。 SQL 的格式不會改變每個/循環,只有數據會改變。 因此,只需要為每次迭代execute查詢。

最后:

您的問題代碼中缺少兩個結束}} 確保修復這些語法錯誤。 我懷疑它們只是問題中的一個遺漏,因為你說代碼在本地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM