在 PDO 的 JS 代码中使用 PHP 数组

Posted

技术标签:

【中文标题】在 PDO 的 JS 代码中使用 PHP 数组【英文标题】:Using PHP array in the JS code in PDO 【发布时间】: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 【参考方案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 数组:)

【讨论】:

以上是关于在 PDO 的 JS 代码中使用 PHP 数组的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中,是不是可以使用 PDO 获取一维数组? [复制]

如何使用 PDO 在 PHP 中获取结果数组?

如何使用 PDO 在 PHP 中获取结果数组?

如何使用PDO在PHP中获取结果数组?

如何使用 pdo 将字符串数组传递给 php 中的 plsql 例程

PHP PDO 将数组转换为不同的格式