首页 > 解决方案 > 为什么php将空行写入文本文件?

问题描述

我有一个表单,其中复选框将选定的行发布到 $_POST['select'][$i] 数组中,该数组用于从数据库中选择数据。sql 的结果用于将结果写入带有换行符的文本文件,但只写入第一行,其他为空行。请帮忙。我的代码如下。

<?php 

    $rowCountd = count($_POST["select"]);
    for($i=0;$i<$rowCountd;$i++) {

        $rowwd=$_POST['select'][$i]; 

        $path_stu_test = $_SERVER['USERPROFILE'].'\Documents\performance/student_test.txt';

        $file_stu_test = fopen($path_stu_test, 'w');    

        $stmt = $db->prepare('SELECT row_no, adms_no, full_name from stu_perform where row_no= :rowwd1');

        $stmt->bindParam(':rowwd1', $postrowwd1, SQLITE3_TEXT); $postrowwd1 = $rowwd;
        $ret = $stmt->execute(); 

        while($row = $ret->fetchArray(SQLITE3_ASSOC)){

            $adms_not = $row['adms_no'];
            $full_namet = $row['full_name'];
            $file2 = "$adms_not~$full_namet\r\n";
            fwrite($file_stu_test, $file2);

        }
    }
?>

我认为问题在于我在 for() 循环中使用 fwrite 和 While(){} 块的方式,因为下面的代码有效,即它显示写入所有 sql 结果

<?php

    $rowwd = 02;
    $path_stu_test = $_SERVER['USERPROFILE'].'\Documents\performance/student_test.txt';

    $file_stu_test = fopen($path_stu_test, 'w');

    $stmt = $db->prepare('SELECT row_no, adms_no, full_name from stu_perform where row_no= :rowwd1');

    $stmt->bindParam(':rowwd1', $postrowwd1, SQLITE3_TEXT);
    $postrowwd1 = $rowwd;
    $ret = $stmt->execute();

    while($row = $ret->fetchArray(SQLITE3_ASSOC)){

        $adms_not = $row['adms_no'];
        $full_namet = $row['full_name'];

        $file2 = "$adms_not~$full_namet\r\n";
        fwrite($file_stu_test, $file2);

    }
?>

标签: php

解决方案


两种可能的方法 - 顺便说一句,都没有测试。我在原始代码中注意到的一件事是创建准备好的语句的方式 - 即在循环内部。准备好的语句的优点和功能之一是您应该创建它一次但执行多次〜所以下面的第一个示例在循环外准备查询并在循环内使用数组中的不同值每次递增执行多次。

<?php 

    if( !empty( $_POST['select'] ) ){

        $bytes=array();
        $count=count( $_POST['select'] );
        $outputfile=sprintf( '%s/Documents/performance/student_test.txt', $_SERVER['USERPROFILE'] );

        $sql='select `row_no`, `adms_no`, `full_name` from `stu_perform` where `row_no`=:id;';
        $stmt=$db->prepare( $sql );

        if( $stmt ){

            $stmt->bindParam( ':id', $id, SQLITE3_TEXT );

            for( $i=0; $i < $count; $i++ ){

                $id = $_POST['select'][ $i ];
                $result = $stmt->execute();

                if( $result ){
                    while( $rs=$result->fetchArray( SQLITE3_ASSOC ) ){
                        $data = sprintf( '%s~%s', $rs['adms_no'], $rs['full_name'] );
                        $bytes[]=file_put_contents( $outputfile, $data . PHP_EOL, FILE_APPEND );
                    }
                }
            }

            if( !empty( $bytes ) ) printf( '%d entries and %s bytes written to file',count( $bytes ), array_sum( $bytes ) );

        }
    }
?>

in您可以在许多数据库引擎中使用关键字(即select * from tbl where id in (1,2,3,99)等),而不是多次执行

<?php 

    if( !empty( $_POST['select'] ) ){

        $bytes=array();
        $count=count( $_POST['select'] );
        $outputfile=sprintf( '%s/Documents/performance/student_test.txt', $_SERVER['USERPROFILE'] );

        $sql='select `row_no`, `adms_no`, `full_name` from `stu_perform` where `row_no` in ( :ids );';
        $stmt=$db->prepare( $sql );

        if( $stmt ){

            $stmt->bindParam( ':ids', $ids, SQLITE3_TEXT );
            $ids = implode( ',', $_POST['select'] );

            $result = $stmt->execute();

            if( $result ){
                while( $rs=$result->fetchArray( SQLITE3_ASSOC ) ){
                    $data = sprintf( '%s~%s', $rs['adms_no'], $rs['full_name'] );
                    $bytes[]=file_put_contents( $outputfile, $data . PHP_EOL, FILE_APPEND );
                }
            }


            if( !empty( $bytes ) ) printf( '%d entries and %s bytes written to file', count( $bytes ), array_sum( $bytes ) );

        }
    }
?>

作为测试上述内容的快速演示,我在阅读您的评论后将以下内容放在一起。这显然与我的系统和数据库( mysql )有关,但严格遵循上述逻辑

<?php
    $field='select';

    if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $_POST[ $field ] ) ){
        ob_clean();

        require 'pdoconn.php';

        $file=__DIR__ . '/tmp-output.txt';
        $bytes=array();

        $sql='select * from `city` where `id`=:id';
        $stmt=$db->prepare( $sql );

        if( $stmt ){
            $stmt->bindParam( ':id', $id, PDO::PARAM_INT );
            foreach( $_POST[ $field ] as $index => $id ){
                $stmt->execute();
                while( $rs=$stmt->fetch( PDO::FETCH_OBJ ) ){
                    $bytes[]=file_put_contents( $file, sprintf( 'ID:%d, Name:%s, Country Code:%s, District: %s', $rs->ID, $rs->Name,$rs->CountryCode,$rs->District ) . PHP_EOL, FILE_APPEND );
                }
            }
        }
    }
?>
<!doctype html>
<html>
    <head>
        <meta charset='utf-8' />
        <title>multi-checkboxes - read from db, write to text file</title>
        <style>
            form{width:50%;float:none;margin:5rem auto 0 auto;}
            label{display:inline-block;margin:1rem auto;float:none;width:20%;text-align:center;border:1px dotted gray;box-sizing:border-box;}
            input[type='submit']{width:100%;padding:1rem;}
        </style>
    </head>
    <body>
        <form method='post'>
            <?php
                for( $i=1; $i <= 25; $i++ ){

                    $checked = rand(0,1) == 1 ? 'checked' : '';
                    $br = $i > 0 && $i % 5==0 ? '<br />' : '';

                    /* assume that the valud is equal to the ID of whatever record .... */
                    printf( '<label>%s<input type="checkbox" name="select[]" value="%d" %s /></label>%s', sprintf( 'Item: %d', $i ), $i, $checked, $br );
                }
                if( !empty( $bytes ) ) printf( '<p>%d entries and %s bytes written to file</p>',count( $bytes ), array_sum( $bytes ) );
            ?>
            <input type='submit' />
        </form>
    </body>
</html>

--

提交表格之前 这显示了在提交表单之前随机选择的复选框

提交表格后 这显示了提交表单后写入文件的数据。检查第二张图片中的 ID 是否与第一张图片中选中的复选框相对应(尽管我意识到你看不到它们全部)


推荐阅读