【问题标题】:Using PHP array in the JS code in PDO在 PDO 的 JS 代码中使用 PHP 数组
【发布时间】:2017-12-12 14:07:23
【问题描述】:

我正在尝试在 JS 中使用 PHP 数组,但遇到了我不知道如何修复的错误。

我使用的是这个例子(在我的例子中 - 它是 PDO,而不是 mysqli。):Inserting MYSQL results from PHP into Javascript Array

$pdo = new PDO('mysql:host=localhost; dbname=' . $db_name . '; charset=utf8mb4', $db_user, $db_password);  
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$type_zagon = 1;
$id_kurat = 1;
$usid = 78;

$stmt1 = $pdo->prepare("SELECT num FROM tb_zagon_id WHERE status = :status 
    AND type = :type AND zagon_id = :zagon_id AND user_id = :usid ORDER BY num");
$num = $stmt1->fetchColumn();
$stmt1->execute(array(
    ':status' => 1,
    ':type' => $type_zagon,
    ':zagon_id' => $id_kurat,
    ':usid' => $usid
));

    $gyvuliu_array = array();

    while ($stmt1->fetch(PDO::FETCH_ASSOC)) {
        $gyvuliu_array[] = $num;
    }

    $array_encode = json_encode($gyvuliu_array);
?>              
    <script>
        $('.surinkti_produkcija_paserti_gyvulius').click(function() {
            var gyvuliai_fermoje = '<?php echo $array_encode; ?>';
            var gyvuliu_array = [1,2,3,4,5,6,7,8,9];

            for (var i=0, l=gyvuliu_array.length; i<l; i++) { // WORKS
                console.log(gyvuliu_array[i]);
            }

            // DOESN'T WORK (console returns f,a,l,s,e,f,a,l,s,e and so on..)
            for (var i=0, l=gyvuliai_fermoje.length; i<l; i++) {
                console.log(gyvuliai_fermoje[i]);
            }                       
        });
    </script>

我猜 $num 变量有问题,但我不确定。

编辑: 我已经更改了第二个 for 循环,看起来它正在工作:

for (var i=0, l=gyvuliai_fermoje.length; i<l; i++) { 
    console.log(gyvuliai_fermoje[i]);
}

但我不确定它们不在同一行是否可以。 http://prntscr.com/ft4i9m

编辑 2 在 rickdenhaan 的评论之后,它看起来正是第一个 for 循环。可以吗?我做完了吗?

【问题讨论】:

  • 我认为您需要使用bindColumn 而不是fetchColumn 以使$numfetch() 调用后自动更新。
  • 还有console.log(gyvuliai_fermoje)
  • 谢谢你们,将这两件事结合起来效果很好。但是我注意到了一件小事:为什么数字“37”在哪里,而所有数组项都是字符串,而不是数字? prntscr.com/ft4glu
  • 数字“37”表示浏览器的控制台正在记录完全相同的内容 37 次,并将它们组合在一起。它们是字符串而不是数字的原因是因为$num 可能是一个字符串。如果您 100% 确定它始终是一个数字,则可以在将其添加到 $gyvuliu_array 时将其转换为 (int)$num

标签: javascript php jquery mysql pdo


【解决方案1】:
var gyvuliai_fermoje = <?php echo $array_encode; ?>;

您必须删除引号,为什么?如果将值放在引号中,则表示 var gyvuliai_fermoje 是字符串而不是数组

【讨论】:

  • 如果我删除它们,数字“37”会消失,但现在显示非常奇怪的结果:prntscr.com/ft4h8c
  • 这就是它的外观,这就是控制台记录 Javascript 字符串数组的方式。您之前所拥有的是控制台记录一个 看起来 像字符串数组(37 次)的字符串。
【解决方案2】:

你可以试试这个吗

 $stmt1 = $pdo->prepare("SELECT GROUP_CONCAT(num) as nums FROM tb_zagon_id WHERE status = :status 
    AND type = :type AND zagon_id = :zagon_id AND user_id = :usid ORDER BY num");
 $stmt1->execute(array(
    ':status' => 1,
    ':type' => $type_zagon,
    ':zagon_id' => $id_kurat,
    ':usid' => $usid
));
 $row = $stmt1->fetch(); 
 $array_encode = json_encode(explode(",",$row["nums"]));
?>
 <script>
    var gyvuliai_fermoje = <?php echo $array_encode; ?>;
    $('.surinkti_produkcija_paserti_gyvulius').click(function() {
        var gyvuliu_array = [1,2,3,4,5,6,7,8,9];

        for (var i=0, l=gyvuliu_array.length; i<l; i++) { // WORKS
            console.log(gyvuliu_array[i]);
        }

        // DOESN'T WORK (console returns f,a,l,s,e,f,a,l,s,e and so on..)
        for (var i=0, l=gyvuliai_fermoje.length; i<l; i++) {
            console.log(gyvuliai_fermoje[i]);
        }                       
    });
 </script>

【讨论】:

  • 谢谢你的回答,我想我已经找到了解决办法:)
【解决方案3】:

试试这个

var gyvuliai_fermoje = <?php echo json_encode($array_encode, JSON_HEX_QUOT | JSON_HEX_APOS); ?>;

【讨论】:

  • 谢谢你的回答,我想我已经找到了解决办法:)
【解决方案4】:

问题解决了! :) 对于未来的访问者,结合你们所说的所有这些东西,我们有这个代码:

// PDO Connection
$pdo = new PDO('mysql:host=localhost; dbname=' . $db_name . '; 
    charset=utf8mb4', $db_user, $db_password);  
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Prepared statement with placeholders
$stmt1 = $pdo->prepare("SELECT num FROM tb_zagon_id WHERE status = :status
    AND type = :type AND zagon_id = :zagon_id AND user_id = :usid ORDER BY num");

// Binding query result to the $num variable (1 is the first column)
$stmt1->bindColumn(1, $num);

// Executing query and replacing placeholders with some variables
$stmt1->execute(array(
    ':status' => 1,
    ':type' => $type_zagon,
    ':zagon_id' => $id_kurat,
    ':usid' => $usid
));

// Creating a PHP array
$gyvuliu_array = array();

// Fetching through the array and inserting query results using $num variable ((int) makes sure a value is an integer)
while ($stmt1->fetch(PDO::FETCH_ASSOC)) {
    $gyvuliu_array[] = (int)$num;
}

// Encoding PHP array so we will be able to use it in the JS code
$array_encode = json_encode($gyvuliu_array);
?>
<script>
    var gyvuliai_fermoje = <?php echo $array_encode; ?>;

    for (var i = 0; i < gyvuliai_fermoje.length; i++) {
        // Stuff you would like to do with this array, access elements using gyvuliai_fermoje[i]
    }
</script>

希望能帮助你理解如何在 PDO 的 JS 代码中使用 PHP 数组:)

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 2016-09-21
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多