im试图在php中创建一个循环,它会抛出下面的内容

kgqe7b3p  于 2021-06-20  发布在  Mysql
关注(0)|答案(5)|浏览(230)

我试着用php做一个循环,把下面的内容吐出来

$sqlons = "SELECT * FROM products WHERE ons = 1";
$ons = $db->query($sqlons);
$sqlpopa = "SELECT * FROM products WHERE popa = 1";
$popa = $db->query($sqlpopa);
$sqlnewr = "SELECT * FROM products WHERE newr = 1";
$newr = $db->query($sqlnewr);
$sqlpopm = "SELECT * FROM products WHERE popm = 1";
$popm = $db->query($sqlpopm);
$sqlpopm2 = "SELECT * FROM products WHERE popm = 2";
$popm2 = $db->query($sqlpopm2);
$sqlfeata = "SELECT * FROM products WHERE feata = 1";
$feata = $db->query($sqlfeata);
$sqlfeata2 = "SELECT * FROM products WHERE feata = 2";
$feata2 = $db->query($sqlfeata2);
$sqlbests = "SELECT * FROM products WHERE bests = 1";
$bests = $db->query($sqlbests);
$sqlbests2 = "SELECT * FROM products WHERE bests = 2";
$bests2 = $db->query($sqlbests2);
$sqlbests3 = "SELECT * FROM products WHERE bests = 3";
$bests3 = $db->query($sqlbests3);
$sqlsea = "SELECT * FROM products WHERE sea = 1";
$sea = $db->query($sqlsea);

我现在已经做过了

$vart = array("sqlons", "sqlpopa", "sqlnewr", "sqlpopm", "sqlfeata", "sqlbests", "sqlsea");
$vart2 = array("ons", "popa", "newr", "popm", "feata", "bests", "sea");
$var = array("ons", "popa", "newr", "popm", "popm", "feata", "feata", "bests", "bests", "bests", "sea");
$var2 = array("1", "1", "1", "1", "2", "1", "2", "1", "2", "3", "1");
foreach($var as $v){
    foreach($var2 as $v2){
        foreach($vart as $t){
            "$".$t = "SELECT * FROM products WHERE $v = $v2";
            foreach($vart2 as $t2){
            "$".$t2 = $db->query("$".$t);
            }
        }
    }
}

但是我得到了一个未定义的变量,比如“undefined variable:ons in c:\xampp\htdocs\anibuy\pages\index.php on line 90”
请帮帮我!:)
抱歉,如果我添加了html/php代码,这可能会有所帮助

<?php while($product = mysqli_fetch_assoc($ons)) : ?>
                        <div class="<?= $product['class']; ?>">
                            <div class="grid-col-1">
                                <img class="featured-image img-responsive" src="<?= $product['img']; ?>">
                            </div>
                            <div class="grid-col-2">
                                <h2 class="featured-heading"><?= $product['title']; ?></h2>
                                <div class="grid-col-3">
                                    <div class="span-text"><?= $product['about']; ?><br></div><div class="buy-now"><a href="#">BUY NOW</a></div>
                                </div>
                            </div>
                        </div>
                    <?php endwhile; ?>

不止一篇论文,还有多篇论文从phpmyadmin数据库中吐出了img标题ect

<?php while($product = mysqli_fetch_assoc($popa)) : ?>
                            <div class="<?= $product['class']; ?>">
                            <div class="buy-now buy"><a href="#">BUY NOW</a></div>
                                <div h4 class="read-more" onclick="rmModal(<?= $product['id'];?>)"><a href="#rmModal-<?= $product['title'];?>.php">READ MORE</a></div>
                                <div class="featured-image"><img class="featured-image img-pop-anime img-responsive" src="<?= $product['img']; ?>"></div>
                            </div>
                            <?php endwhile; ?>
    <?php while($product = mysqli_fetch_assoc($newr)) : ?>
                        <div class="<?= $product['class']; ?>">
                            <div class="buy-now buy"><a href="#">BUY NOW</a></div>
                            <div h4 class="read-more" onclick="rmModal(<?= $product['id'];?>)"><a href="#rmModal-<?= $product['title'];?>.php">READ MORE</a></div>
                            <div class="grid-col-1"><img class="featured-image img-new" src="<?= $product['img']; ?>"></div>
                        </div>
                    <?php endwhile; ?>

到目前为止我已经试过了

$vars = array("ons" => 1, "popa" => 1, "newr" => 1);
 foreach ($vars as $key => $value) {
"$"."sql".$key = "SELECT * FROM products WHERE $key = $value";
"$".$key = $db->query("$"."sql".$key);
// echo "$"."sql".$key;
// echo $value;
// echo "$".$key;
   }

但是它给了我一个错误mysqli\u fetch\u assoc()期望参数1是mysqli\u result,字符串在c:\xampp\htdocs\anibuy\pages\index.php的第142行给出
如果有人对网站的外观感兴趣,这里的url只有html、css和js:https://54x1.github.io/anibuy/pages/indexv2.html
以下是php和mysql的文件,我将sql导出包含在anibuy文件夹中,顺便说一句…/pages/index.php:https://drive.google.com/drive/folders/1muym2sh1bsxf3uacxavoiwtkublcovod?usp=sharing

rjee0c15

rjee0c151#

根据您的评论,您已经有了正确的基本思想,但是实现实际上可以比您得到的要简单得多。首先,你的“控制”值,即数组 $vart etc的格式称为数组结构,而使用数组结构可能会容易得多。
数组结构的问题是,当你真的想并行地沿着所有四个数组前进时,你有多个嵌套循环试图在它们上面迭代-如果你使用一个数组结构,这个问题基本上消失了。
所以把数据改成这样:

$vars = array(
    array(
        "select" => "ons",
        "compare" => "1",
        "result" => "ons"
    ),
    // etc. etc.
    array(
        "select" => "bests",
        "compare" => "2",
        "result" => "bests2"
    ),
    // ...
``` `select` 当你站在 `SELECT` 条款, `compare` 将是右手边,并且 `result` 将是数据降落的地方。
现在像这样制作循环:

foreach ($vars as $sqldata) {
$select = $sqldata->select;
$compare = $sqldata->compare;
$result = $sqldata->result;
$$result = $db->query("SELECT * FROM products WHERE $select = $compare");
}

是的,我的意思是最后一行有两美元。这会让你达到你想去的地方,但有一个警告。在输入这个之前,如果结果不是这样的话,您需要做一些事情来让目标变量存在 `$$result` 一旦你离开这个地方 `foreach` 循环。
或者在开始之前创建一个空数组,并在运行时将结果存储在该数组中。
8ulbf1ek

8ulbf1ek2#

当$v在查询字符串中时,像这样 Package 它{$v}。
您还应该重新设计阵列:

$vars = ["ons" => 1, "popa" => 1, ... ];
$results = [];
foreach($vars as $vkey => $vval){
   $results[$vkey] = $db->query("SELECT * FROM products WHERE {$vkey} = {$vval}")->fetch_assoc();
}

edited:添加了fetch\u assoc()调用,假设只返回一行。否则,必须使用嵌套的while:

$vars = ["ons" => 1, "popa" => 1, ... ];
$results = [];
foreach($vars as $vkey => $vval){
   $results[$vkey] = [];
   $result = $db->query("SELECT * FROM products WHERE {$vkey} = {$vval}");
    while($row=$result->fetch_assoc()){
        $results[$vkey][] = $row;
    }
}
hm2xizp9

hm2xizp93#

在foreach循环中,$v变量是什么?它似乎没有在任何地方定义。

"$".$t = "SELECT * FROM products WHERE $v = $v2";
bvuwiixz

bvuwiixz4#

在你这边触发的错误,很奇怪,因为当我在我这边运行你的代码时,我没有得到它。
在第一个数组中,添加所有字段名和值,其中ons是字段名,1是where条件的值。其他人也一样。 $key =数据库中的字段名 $value =字段名的值

// As you have different values for bests, 1, 2, 3 and for others
// If we used bests as index ex: array('bests' => 2, 'bests' => 3). The data
// will be overwritten by the next bests as they have the same index.
// 'fieldname_value' where fieldname = ons and value = 1
$vars    = array('ons_1', 'bests_1', 'bests_2', 'bests_3'); 
$results = array();
foreach ($vars as $key => $value) {

// Here I break the value which is ex: ons_1 into 
// an array(ons, 1). This will repeat for the other values.
$values = explode('_', $value);

$sql = "SELECT * FROM products WHERE $values[0] = $values[1]"; // $values[0] = fieldname $values[1] = value_of_fieldname

$result = mysqli_query($db, $sql);

if (mysqli_num_rows($result) > 0) {
    // output data of each row
    while($row = mysqli_fetch_assoc($result)) {
        $results[$value][] = $row; // Add all rows for fieldnames (ex: ons_1, bests_1, bests_2) inside $result array
    }
} 
} 

/**
 *
 * First var_dump($results); to get a clearer view of what's going on below
 *
 * The array $results contain an array of arrays 
 * Ex: $results = array ('ons_1' => array( 0 => array('class' => your_class), 'bests_1' => array( 0 => array('class' => your_class)) 
 *
 * This if line checks whether the index exist isset($results['ons_1']) and if it is not empty !empty($results['ons_1'])
 * before doing the foreach loop. It would be unecessary to do a foreach loop that will trigger an error if ons_1 does
 * not exist and has no data. This is why this check is done.
 * 
 * The foreach loop on the other hand will loop through all the data present in 'ons_1' array. var_dump($result['ons_1']); to 
 * have an idea of what's going ons. 
 *
 */

?>

<div class="grid-container container-fluid ">
    <div id="home-page" class="home-page">

     <h2 class="featured-heading-2">On Sale Now!</h2>
        <div class="home-page-onsale">
            <?php if (isset($results['ons_1']) && !empty($results['ons_1'])) { ?>

                <?php foreach ($results['ons_1'] as $key => $product) { ?>
                        <div class="<?php echo $product['class']; ?>">
                        <div class="buy-now buy"><a href="#">BUY NOW</a></div>
                        <div h4 class="read-more" onclick="rmModal(<?php echo $product['id']; ?>)"><a href="#rmModal-<?php echo $product['title']; ?>.php">READ MORE</a></div>
                        <div class="grid-col-1"><img class="featured-image img-new" src="<?php echo $product['img']; ?>"></div>
                        </div>
                <?php } ?>
            <?php }?>
        </div>

        <div class="breakpoint-3">
                    <div class="home-page-best-anime">
                        <h2 id="home-page-best-anime bpshow" class="featured-heading-2">Best Sellers</h2>
                        <div class="home-page-best-anime-row-1">
                            <?php if (isset($results['bests_1']) && !empty($results['bests_1'])) { ?>

                                <?php foreach ($results['bests_1'] as $key => $product) { ?>
                                        <div class="<?php echo $product['class']; ?>">
                                        <div class="buy-now buy"><a href="#">BUY NOW</a></div>
                                        <div h4 class="read-more" onclick="rmModal(<?php echo $product['id']; ?>)"><a href="#rmModal-<?php echo $product['title']; ?>.php">READ MORE</a></div>
                                        <div class="grid-col-1"><img class="featured-image img-new" src="<?php echo $product['img']; ?>"></div>
                                        </div>
                                <?php } ?>
                            <?php }?>
                        </div>
                        <div class="home-page-best-anime-row-2">
                            <?php if (isset($results['bests_2']) && !empty($results['bests_2'])) { ?>

                                <?php foreach ($results['bests_2'] as $key => $product) { ?>
                                        <div class="<?php echo $product['class']; ?>">
                                        <div class="buy-now buy"><a href="#">BUY NOW</a></div>
                                        <div h4 class="read-more" onclick="rmModal(<?php echo $product['id']; ?>)"><a href="#rmModal-<?php echo $product['title']; ?>.php">READ MORE</a></div>
                                        <div class="grid-col-1"><img class="featured-image img-new" src="<?php echo $product['img']; ?>"></div>
                                        </div>
                                <?php } ?>
                            <?php }?>
                        </div>
                        <div class="home-page-best-anime-row-3">
                            <?php if (isset($results['bests_3']) && !empty($results['bests_3'])) { ?>

                                <?php foreach ($results['bests_3'] as $key => $product) { ?>
                                        <div class="<?php echo $product['class']; ?>">
                                        <div class="buy-now buy"><a href="#">BUY NOW</a></div>
                                        <div h4 class="read-more" onclick="rmModal(<?php echo $product['id']; ?>)"><a href="#rmModal-<?php echo $product['title']; ?>.php">READ MORE</a></div>
                                        <div class="grid-col-1"><img class="featured-image img-new" src="<?php echo $product['img']; ?>"></div>
                                        </div>
                                <?php } ?>
                            <?php }?>
                        </div>
                    </div>

    </div>
    </div>
</div>
cnh2zyt3

cnh2zyt35#

您的问题是,您将字符串用作行中的代码,如:

"$".$t = "SELECT * FROM products WHERE $v = $v2";

以及:

"$".$t2 = $db->query("$".$t);

您需要做的是将代码放入eval()函数中,如下所示:

eval('$'.$t.' = "SELECT * FROM products WHERE $var$v = $v2";');

我认为你使用的所有foreach循环都会有另一个问题,因为你所有的数组都有相同数量的元素,你应该这样做:

for ($i=0; $i <count($vart) ; $i++) { 
    eval('$'.$vart[$i].' = "SELECT * FROM products WHERE $var[$i] = $var2[$i]";');
    eval("$".$vart2[$i] .'= $db->query("$".$vart[$i]);');
}

试试看,告诉我你是怎么做的

相关问题