[英]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.