【问题标题】:Php while loop with js variables带有js变量的php while循环
【发布时间】:2023-04-10 08:06:01
【问题描述】:

计划:

基本上我有一组服装项目存储在一个表中,每个包含“item_name”“item_id”和“item_shortcode”我希望每个服装项目都有一个链接,当用户单击需要添加项目的链接时一个数组(选中的数组)


我正在尝试根据我从 mySQL 数据库收集的数据创建一个 javascript 对象,然后在我的方法单击 div 时将该数据传递给函数。

这是一个例子:

<?php 
    while($row = mysql_fetch_array($results)){ 
?>

<script>
    var item = new Object();
    item.itemName = <?php echo json_encode($row['item_name']); ?>;
</script>

<?php
            echo "<div id=\"".$row['item_name']."\" class=\"choice\" onclick=\"SetSelectedChoice(item);\">";
            //echo $row['item_name'];
            echo "</div>";
        }
    }
?>

编辑:这只是一个示例,我将使用大量数据填充我的对象,而不仅仅是 item_name

问题是最后一个对象似乎分配给了 while 循环中的每个 div。

有人指出我哪里错了吗?

【问题讨论】:

  • 好吧,把你的名字放在引号里,否则你可能会得到 item.itemName = 一些会导致可怕错误的长字符串;
  • 另外,如果没有人会为此对你大喊大叫 - 你应该切换到 PDO 或 mysqli。 mysql_ 函数已被弃用,很快就会被彻底清除。
  • gah不知道mysql功能需要被取代!
  • 我只是将 php 集合变成一个数组,然后将它直接 jsonencode 为一个 js 变量。或者更好的是,此时使用 ajax 获取它。
  • @Kevin B 这听起来像是一个更好的解决方案,干杯

标签: php jquery mysql


【解决方案1】:

好吧,老实说,我不知道我是否真的明白了你,但如果我没看错,那么你只需在 while 循环的每次运行中覆盖 item-object。 在最后一个循环之后(输出之后),变量“item”被设置为循环的最后一个结果,所以点击任何 div 都会返回“item”——循环的最后一个项目。

作为一种解决方案,尝试将div中的行名称保存为参数,例如

echo "<div id=\"".$row['item_name']."\" class=\"choice\" onclick=\"SetSelectedChoice(\'".$row['item_name']."\');\">";

【讨论】:

  • 感谢您的回复,请检查编辑,我将使用大约 5 个字段填充该对象。
  • 我不知道这如何通过覆盖或通过处理参数中的项目(如在我的示例中)或通过检索信息的附加函数来解决问题的原因,如凯的例子。
【解决方案2】:

您在每次迭代中重新定义项目。为什么不这样做:

根据编辑,您可以创建一个项目数组并将其填充到循环中:

<script type="text/javascript">
    var objects = new Array();
</script>

<?php while($row = mysql_fetch_array($results)): ?>
    <script type="text/javascript">
        var item = new Object();
        item.itemName = '<?php echo json_encode($row['item_name']); ?>';
        objects.push(item);
    </script>
    <div id="<?php echo $row['item_id']; ?>" class="choice">
            <?php echo $row['item_name']; ?>
    </div>
<?php endwhile; ?>

然后在循环之外的 js 中:

$('.choice').on('click', function(){
    SetSelectedChoice($(this).html());
});

function SetSelectedChoice(name)
{
    for(var i = 0; i < objects.length; i ++)
    {
        if(objects[i].itemName == name)
        {
            //do something
        }
    }
}

注意:我真的不推荐这种奇怪的循环来比较名称。我只是不知道您在将名称传递给此函数时还做了什么。我会传递项目 id 或索引值并直接访问数组中的项目而不是循环。有意义吗?

基本上,停止使用 onclick。整个世界都更加依赖听众。其次,根本不需要创建对象。您似乎没有使用它,即使您使用了,也没有像字符串那样在名称周围加上单引号。三、请跳出php来写html。它只是更清洁,更容易。此外,将项目的 id 分配给 id 参数。在元素的 id 中包含名称和空格真的很难看。而且您似乎并不真的需要一个,因为您没有在示例中使用它。尽管如此,我还是把它放在那里,以防你想在点击监听器中像$(this).attr('id') 一样访问它。

但如果我错过了重点,也许您可​​以澄清一下,我可能会更新以更好地满足您的需求

【讨论】:

  • 感谢您的回复,请检查编辑,我有大约 5 个字段将用于填充该对象。
  • 已更新以更符合您的需求,但仍应进行一些清理。
猜你喜欢
  • 2019-11-30
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 2021-10-23
  • 1970-01-01
相关资源
最近更新 更多