SELECT Input仅从数据库返回有限值

时间:2016-01-24 08:13:48

标签: javascript php mysql

这可能听起来很奇怪,但希望有人可以找出并帮助我解决这个问题。

我正在从MySql数据库中检索许多值。我的数据库中至少有300行正在导出到我的JavaScript文件中。这些值在我的<option>输入中显示为<select>。当我运行我的文件时,<select>输入未返回任何<option>值。

我想知道发生了什么,并意识到返回了很多值。所以我对SQL数据进行了限制,我得出结论,如果php代码中没有<select>函数,WHERE输入只返回最多13个值,如果有{WHERE则只返回10个值{1}}功能。

我确实尝试手动放置数据而不从数据库中检索数据,它只接受至少300个值中的25个值。

我的问题是:

  • <select>中显示的数据是否真的有限制 输入?如果有,有没有办法绕过它?如果没有,那是什么 可能出错了?

以下是您需要的代码。我只是简化并删除了一些数据来形象化我的意思。

HTML

<form action="" method="post" id="demo-form2" data-parsley-validate class="form-horizontal form-label-left">
    <div class="form-group">
    <label class="control-label col-md-3 col-sm-3 col-xs-12" for="first-name">Search Topic
    </label>
    <div class="col-md-6 col-sm-6 col-xs-12">
    <select id="userDropdown" name="tid" class="select2_single form-control col-md-7 col-xs-12"></select>

    </div>
</div>
<div class="form-group">
    <label class="control-label col-md-3 col-sm-3 col-xs-12" for="first-name">Description <span class="required">*</span>
    </label>
    <div class="col-md-6 col-sm-6 col-xs-12">
        <input type="text" id="description" name="description"  class="form-control col-md-7 col-xs-12" />
    </div>
</div>
<div class="form-group">
    <label class="control-label col-md-3 col-sm-3 col-xs-12" for="first-name">Assigned to <span class="required">*</span>
    </label>
    <div class="col-md-6 col-sm-6 col-xs-12">
        <input type="text" id="assign" name="assign" class="form-control col-md-7 col-xs-12" />
    </div>
</div>
<div class="form-group">
    <label class="control-label col-md-3 col-sm-3 col-xs-12" for="last-name">Comments: <span class="required">*</span>
    </label>
    <div class="col-md-6 col-sm-6 col-xs-12">
        <input type="text" id="comments" name="comments"   class="form-control col-md-7 col-xs-12">
    </div>
</div>

<div class="form-group">
    <label for="middle-name" class="control-label col-md-3 col-sm-3 col-xs-12">Words</label>
    <div class="col-md-6 col-sm-6 col-xs-12">
        <input id="words" class="form-control col-md-7 col-xs-12" type="text" name="words">
    </div>
</div>


  </div>
<div class="ln_solid"></div>
<div class="form-group">
    <div class="col-md-6 col-sm-6 col-xs-12 col-md-offset-3">
        <input type="submit" name="submit" class="btn btn-success" value="Update" />
    </div>
</div>

JAVASCRIPT

 <script>



    //sql data...
    var data = [   <?php
        $req = mysql_query('select * from tasks');
            while($dnn = mysql_fetch_array($req))
              {
              ?>  {username: '<?php echo $dnn['username'] ?>', tid: '<?php echo $dnn['tid'] ?>', description: '<?php echo $dnn['description'] ?>'},
    //this would return at least 300 results

<?php } ?>

    ];

    var dropdown = $('#userDropdown');
    dropdown.append('<option value="" >Search for Topic ID</option>');
    for(var i = 0; i < data.length; i++){
        var item = data[i];
        dropdown.append('<option value="' + item.tid + '" >' + item.tid + '-' + item.description + '</option>');
    }

    $('#userDropdown').change(function(){
        var user = this.value;
        var dataItem = $.grep(data, function(e){ return e.tid == user; });

        if(dataItem.length > 0){
            $('#description').val(dataItem[0].description);
            $('#assign').val(dataItem[0].assign);
            }
    });
    </script>

代码没有问题。我把它包括在内作为参考。

编辑:删除php脚本上的LIMIT以避免混淆。

3 个答案:

答案 0 :(得分:0)

你也许可以这样做有点不同:

<?php
    $data=array();
    $req = mysql_query('select * from tasks');

    if( $req ){
        while( $dnn = mysql_fetch_object( $req ) ){
            $data[]=array( 'username'=>$dnn->username, 'tid'=>$dnn->tid, 'description'=>$dnn->description );
        }

        echo "var data=".json_encode( $data ).";";

    }
?>

替代方案,使用mysql_fetch_array

<?php
    $data=array();
    $req = mysql_query('select * from tasks');

    if( $req ){
        while( $dnn = mysql_fetch_array( $req ) ){
            $data[]=array( 'username'=>$dnn['username'], 'tid'=>$dnn['tid'], 'description'=>$dnn['description'] );
        }

        echo "var data=".json_encode( $data ).";";

    }
?>

这是一个经过全面测试的工作示例,包括实际的数据库详细信息

$dbhost =   'localhost';
$dbuser =   'root'; 
$dbpwd  =   'xxx'; 
$dbname =   'xxx';

/*
create table if not exists `tasks` (
  `id` int(10) unsigned not null auto_increment,
  `username` varchar(50) not null default '0',
  `tid` int(10) unsigned not null default '0',
  `description` varchar(50) not null default '0',
  primary key (`id`)
) engine=innodb auto_increment=4 default charset=latin1;

insert into `tasks` (`id`, `username`, `tid`, `description`) values
    (1, 'fred', 1, 'banana'),
    (2, 'joe', 2, 'apple'),
    (3, 'bertrum', 3, 'orange');
*/

$conn=mysql_connect( $dbhost, $dbuser, $dbpwd );
mysql_select_db( $dbname, $conn ) or die(mysql_error());

$sql='select * from tasks';
$res=mysql_query( $sql );

if( $res ){
    $data=array();
    while( $dnn=mysql_fetch_object( $res ) ){
        $data[]=array( 'username'=>$dnn->username, 'tid'=>$dnn->tid, 'description'=>$dnn->description );    
    }
    echo "var data=".json_encode( $data ).";";
}
mysql_close( $conn );

输出:

var data=[{"username":"fred","tid":"1","description":"banana"},{"username":"joe","tid":"2","description":"apple"},{"username":"bertrum","tid":"3","description":"orange"}];

答案 1 :(得分:0)

存在以下潜在问题:

  1. PHP生成的用于填充数据 Javascript数组的数据可能包含单引号,从而破坏了Javascript代码,然后不会继续填充SELECT;

  2. 数据也可能包含双引号,这会破坏填充SELECT列表的Javascript代码;

  3. 数据中的任何小于或大于标志都可能导致HTML无法正确呈现;

  4. 可能存在字符编码问题,因此非UTF-8字符会被解释为这样并产生意外结果。

  5. 要解决这些问题,您应该生成JSON并通过DOM方法填充SELECT列表(通过jQuery&#39; s val() text()),而不是通过字符串连接。

    以下是您可以尝试使用的代码:

    PHP:

    <?php
    // right after connecting to the DB:
    mysql_set_charset('utf8');
    // ...
    $req = mysql_query('select * from tasks');
    $rows = array();
    while($dnn = mysql_fetch_assoc($req)) {
        $rows[] = $dnn;
    }
    ?>
    

    关注此Javascript:

    var data = <?=json_encode($rows)?>;
    var dropdown = $('#userDropdown');
    dropdown.append('<option value="" >Search for Topic ID</option>');
    for(var i = 0; i < data.length; i++){
        var item = data[i];
        dropdown.append(
            $("<option></option>").val(item.id).text(
                item.tid + '-' + item.description));
    }
    
    $('#userDropdown').change(function(){
    //  ... etc...
    

    对于与UTF-8相关的问题,还要确保您的PHP文件以UTF-8编码保存。编辑经常可以选择这个。其次,请确保您的HTML head部分指定了字符集。例如,像这样:

    <head>
        <meta charset="utf-8"/>
    </head>
    

    请注意,mysql_函数已经被弃用了很长时间,并且在PHP 7中不再受支持。您应该切换到mysqli或PDO。

    另请注意,您的HTML的结尾</DIV>太多了,就在上面:

    <div class="ln_solid"></div>
    

答案 2 :(得分:0)

<select>元素没有限制。更优雅的方法是使用 php 中的 here-doc 语法,如下所示:

var data = [
    <?php
        $req = mysql_query('select * from tasks');
        while($dnn = mysql_fetch_array($req, MYSQL_ASSOC)){
            echo <<<DATA
            {
                username : '{$dnn['username']}',
                tid : {$dnn['tid']},
                description : '{$dnn['description']}'
            }           
DATA;
        }
    ?>
];

还要记住:

  

这个javascript-php片段应该嵌入在解析的视图中   php引擎

你不应该把它放在一个外部资产中,在通过 php &amp;解析视图后加载它通过浏览器加载。