php中mysql的双重输出

Posted

技术标签:

【中文标题】php中mysql的双重输出【英文标题】:double output from mysql in php 【发布时间】:2015-07-15 07:06:35 【问题描述】:

我正在从 opencart 安装中选择表名。 尝试将结果(单列)输出为格式类似于 JSON 数组的字符串。 这是代码:

<?php
function getTableNames()
    
    //Change these variables depending on the server it will be used on
    $server = 'localhost';
    $user = 'User1';
    $pass = 'pass';
    $DBName = 'OpenCartTest';

    //returns a single column of all tables in a mysql database named "OpenCartTest"
    $tablesGetSQL = 'Select `table_name` from  `information_schema`.`TABLES` where `table_schema` like "OpenCartTest" AND `table_name LIKE "oc_customer%"';
    $conn = new mysqli($server, $user, $pass, $DBName);
    $JSONStringArray = '[';
    if(mysqli_connect_errno())
    
        echo '---unauthorized---';
    
    else
    
        $result = $conn->query($tablesGetSQL);
        $l = $result->num_rows;
        if($l > 0)
        
            //for($i = 0;$i < $l;$i++)
            while($row = $result->fetch_assoc())
            
                //$row = $result->fetch_assoc();
                foreach($row as $item)
                
                    //echo $item . "|";
                    $JSONStringArray .= "'" . $item . "',";
                
            
        
        $JSONStringArray .= substr($JSONStringArray, 0, -1) . ']';
        $conn->close();
        return $JSONStringArray;
    

$output = getTableNames();
echo substr_count($output, "[") . '<br>';
echo $output;
?>

由于某种原因,输出加倍,有2个'[',但我只将它设置为字符串一次。第一行也没有结束 ']'。

输出:

2
['oc_address','oc_affiliate','oc_affiliate_activity','oc_affiliate_login','oc_affiliate_transaction','oc_api','oc_attribute','oc_attribute_description','oc_attribute_group','oc_attribute_group_description','oc_banner','oc_banner_image','oc_banner_image_description','oc_category','oc_category_description','oc_category_filter','oc_category_path','oc_category_to_layout','oc_category_to_store','oc_country','oc_coupon','oc_coupon_category','oc_coupon_history','oc_coupon_product','oc_currency','oc_custom_field','oc_custom_field_customer_group','oc_custom_field_description','oc_custom_field_value','oc_custom_field_value_description','oc_customer','oc_customer_activity','oc_customer_ban_ip','oc_customer_group','oc_customer_group_description','oc_customer_history','oc_customer_ip','oc_customer_login','oc_customer_online','oc_customer_reward','oc_customer_transaction','oc_download','oc_download_description','oc_event','oc_extension','oc_filter','oc_filter_description','oc_filter_group','oc_filter_group_description','oc_geo_zone','oc_information','oc_information_description','oc_information_to_layout','oc_information_to_store','oc_language','oc_layout','oc_layout_module','oc_layout_route','oc_length_class','oc_length_class_description','oc_location','oc_manufacturer','oc_manufacturer_to_store','oc_marketing','oc_modification','oc_module','oc_option','oc_option_description','oc_option_value','oc_option_value_description','oc_order','oc_order_custom_field','oc_order_fraud','oc_order_history','oc_order_option','oc_order_product','oc_order_recurring','oc_order_recurring_transaction','oc_order_status','oc_order_total','oc_order_voucher','oc_osapi_last_modified','oc_product','oc_product_attribute','oc_product_description','oc_product_discount','oc_product_filter','oc_product_image','oc_product_option','oc_product_option_value','oc_product_recurring','oc_product_related','oc_product_reward','oc_product_special','oc_product_to_category','oc_product_to_download','oc_product_to_layout','oc_product_to_store','oc_recurring','oc_recurring_description','oc_return','oc_return_action','oc_return_history','oc_return_reason','oc_return_status','oc_review','oc_setting','oc_stock_status','oc_store','oc_tax_class','oc_tax_rate','oc_tax_rate_to_customer_group','oc_tax_rule','oc_tg_tglite_revolution_slider','oc_upload','oc_url_alias','oc_user','oc_user_group','oc_voucher','oc_voucher_history','oc_voucher_theme','oc_voucher_theme_description','oc_weight_class','oc_weight_class_description','oc_zone','oc_zone_to_geo_zone',
['oc_address','oc_affiliate','oc_affiliate_activity','oc_affiliate_login','oc_affiliate_transaction','oc_api','oc_attribute','oc_attribute_description','oc_attribute_group','oc_attribute_group_description','oc_banner','oc_banner_image','oc_banner_image_description','oc_category','oc_category_description','oc_category_filter','oc_category_path','oc_category_to_layout','oc_category_to_store','oc_country','oc_coupon','oc_coupon_category','oc_coupon_history','oc_coupon_product','oc_currency','oc_custom_field','oc_custom_field_customer_group','oc_custom_field_description','oc_custom_field_value','oc_custom_field_value_description','oc_customer','oc_customer_activity','oc_customer_ban_ip','oc_customer_group','oc_customer_group_description','oc_customer_history','oc_customer_ip','oc_customer_login','oc_customer_online','oc_customer_reward','oc_customer_transaction','oc_download','oc_download_description','oc_event','oc_extension','oc_filter','oc_filter_description','oc_filter_group','oc_filter_group_description','oc_geo_zone','oc_information','oc_information_description','oc_information_to_layout','oc_information_to_store','oc_language','oc_layout','oc_layout_module','oc_layout_route','oc_length_class','oc_length_class_description','oc_location','oc_manufacturer','oc_manufacturer_to_store','oc_marketing','oc_modification','oc_module','oc_option','oc_option_description','oc_option_value','oc_option_value_description','oc_order','oc_order_custom_field','oc_order_fraud','oc_order_history','oc_order_option','oc_order_product','oc_order_recurring','oc_order_recurring_transaction','oc_order_status','oc_order_total','oc_order_voucher','oc_osapi_last_modified','oc_product','oc_product_attribute','oc_product_description','oc_product_discount','oc_product_filter','oc_product_image','oc_product_option','oc_product_option_value','oc_product_recurring','oc_product_related','oc_product_reward','oc_product_special','oc_product_to_category','oc_product_to_download','oc_product_to_layout','oc_product_to_store','oc_recurring','oc_recurring_description','oc_return','oc_return_action','oc_return_history','oc_return_reason','oc_return_status','oc_review','oc_setting','oc_stock_status','oc_store','oc_tax_class','oc_tax_rate','oc_tax_rate_to_customer_group','oc_tax_rule','oc_tg_tglite_revolution_slider','oc_upload','oc_url_alias','oc_user','oc_user_group','oc_voucher','oc_voucher_history','oc_voucher_theme','oc_voucher_theme_description','oc_weight_class','oc_weight_class_description','oc_zone','oc_zone_to_geo_zone']

我找不到哪里出错了。也许我接下来会在不同的服务器上尝试一下。

【问题讨论】:

while循环内不需要foreach循环 是的,只是为了将来打样。因为只有 1 列它应该循环一次对吗? @user3454479 尝试注释掉第二个 echo gettablenames 【参考方案1】:

不要手动创建您的 JSON 字符串,只需使用 json_encode,这就是为什么这个函数仍然存在:

首先是先收集容器内的所有表名,完成收集、循环和整个位,完成后,然后对其进行编码。

$result = $conn->query($tablesGetSQL);
$JSONStringArray = array(); // initialize container       
while($row = $result->fetch_assoc()) 
    $JSONStringArray[] = $row['table_name']; // push all table names

// finally, encode
$JSONStringArray = json_encode($JSONStringArray);

$conn->close();
return $JSONStringArray;

【讨论】:

会试一试并回复您 好的,工作正常,谢谢,但它仍然没有解释在字符串处理期间有 2 个 '[' 的原因。 @CJ Wurtz 找到它 @Sarfaraaz 不必要的连接 .= 使您当前的字符串翻了一番,但我绝不建议走那条路,不要尝试手动操作,它容易出错,让 json_encode 到它的工作,它更容易,无论如何很高兴这有帮助 谢谢,以后会这样做,如果我需要字符串对象,会将其转换为字符串【参考方案2】:

因为这条线,你得到了两份

$JSONStringArray .= substr($JSONStringArray, 0, -1) . ']';

您执行 .= 正在执行 substr,并将其添加到原始内容中,您应该只执行 =

即,应该只是:

$JSONStringArray = substr($JSONStringArray, 0, -1) . ']';

附带说明,不需要构建 JSON 字符串,PHP 有一个内置方法来生成 json 字符串。相反,您可以这样做

$data = array();
while($row = $result->fetch_row())

    $data += $row; // append returned array to the data array, since you wanted it future proof incase you added more columns to the SELECT query

// close connection
return json_encode($data);

【讨论】:

啊,谢谢你找到它。愚蠢的错误-_-。作为旁注, $data += $row 与 $data .= $row 的工作方式相同吗? 不,.= 是字符串连接的简写,+= 就像我使用的那样是加入数组的简写

以上是关于php中mysql的双重输出的主要内容,如果未能解决你的问题,请参考以下文章

PHP:php错误/警告/通知的双重输出

MySQL---存储过程复习

使用双重循环输出九九乘法表

PHP wordpress 中的一次查询中的双重 MySQL 查询

在csv php中添加用于输出的mysql列?

HDU 4553 约会安排(线段树区间合并+双重标记)