我有一个奇怪的问题。我阅读了所有相关主题,但是没有任何解决方案。我的项目中有一堆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值。 -我对托管公司的回答不满意,但是代码现在可以正常工作。 -感谢您提供所有答案和建议。
答案 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';
它不会对此抱怨。对于其他语言,这可能是一个问题,但是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
进行查询。
最后
:您在问题代码中缺少两个结尾}}
。确保修复这些语法错误。我怀疑它们只是您在本地说明代码有效的问题而已。