【问题标题】:Undefined Index ajax php未定义索引ajax php
【发布时间】:2018-01-25 14:31:53
【问题描述】:

我有问题。我尝试了所有可能的解决方案,但总是得到未定义的索引。我以前试过这个,效果很好。不知道今天发生了什么,我只是复制粘贴而已。

我在这里要做的是进行 AJAX 搜索。

prod_stocks_add.php

    <?php
     include("headerindex.php");
      include("sidebar.php");
     ?>

    <div class="right_col" role="main">
      <div class="">
        <div class="col-md-12 col-sm-12 col-xs-12">
   <ol class="breadcrumb">
      <li class="breadcrumb-item"><a href="prod_info.php">Product Stocks</a></li>
      <li class="breadcrumb-item active">Add Stocks</li>
      <a href="prod_stocks.php" class="btn btn-warning btn-lg pull-right"><i class="fa fa-history"></i>&nbsp;Back</a>
    </ol>

    <div class="x_panel">
    <div class="x_title">
      <h4><b>Add Stocks<b></h4>
          <div class="clearfix"></div>
    </div>
          <div class="x_content">
            <div class="row">
              <div class="col-sm-12">
                <div class="card-box table-responsive">
                  <form role="form" method="post" action="#" class="form-horizontal form-label-left" novalidate enctype="multipart/form-data">
                    <div class="item form-group">
                      <div class="control-label col-md-12 col-sm-12 col-xs-6 form-group top_search" style="margin-left: 90px;">
                        <div class="input-group">
                          <input type="text" name="search" id="search" placeholder="Search for...">
                          <div id="back_result"></div>
                        <!--   <span class="input-group-btn">
                            <select class="btn btn-primary" name="searchfilter" id="searchfilter">
                              <option value="Barcode">Barcode</option>
                              <option value="Item">Item</option>
                            </select>
                            </span> -->
                            <div class="col-md-3 col-sm-3 col-xs-6" style="margin-bottom: -500px;">
                            <!-- <button type="button" class="btn btn-success"><i class="fa fa-check"></i><span>Go</button> -->
                            </div>
                            </div>
                        </div>
                      </div>
                    <br>
                    <div class="item form-group">
                    <label class="control-label col-md-6 col-sm-6 col-xs-12" for="category" name="lbl_category">Item <span class="required">*</span>
                    </label>
                    <div class="col-md-6 col-sm-6 col-xs-12">
                      <label></label>
                    </div>
                  </div>
                  <div class="item form-group">
                    <label class="control-label col-md-6 col-sm-6 col-xs-12" for="barcode" name="lbl_barcode">Barcode <span class="required">*</span>
                    </label>
                    <div class="col-md-6 col-sm-6 col-xs-12">
                      <label></label>
                    </div>
                  </div>
                  <div class="item form-group">
                    <label class="control-label col-md-6 col-sm-6 col-xs-12" for="batch" name="lbl_batch">Batch Stock <span></span>
                    </label>
                    <div class="col-md-6 col-sm-6 col-xs-12">
                      <input type="int" id="batch" name="txt_batch" class="form-control col-md-7 col-xs-12" style="width:200px;">
                    </div>
                  </div>
                  <div class="item form-group">
                    <label class="control-label col-md-6 col-sm-6 col-xs-12" for="total" name="lbl_total">Total Stock <span class="required">*</span>
                    </label>
                    <div class="col-md-6 col-sm-6 col-xs-12 form-group">
                      <label></label>
                    </div>
                  </div>
                  <div class="item form-group" style="margin-top:-300px">
                    <label class="control-label col-md-1 col-sm-1 col-xs-6" for="image" name="lbl_img">Image <span class="required"></span>
                    </label>
                    <div class="col-md-1 col-sm-1 col-xs-6">  
                     <!--  <a tabindex="-1" href="#myModal" data-toggle="modal"><b><i class="fa fa-file-image-o" aria-hidden="true"></i>  PICTURE</b></a><br></br>
                      <a tabindex="-1" href="#myModal" data-toggle="modal" role="button"><i class="fa fa-file-image-o fa-5x" aria-hidden="true"></i></a><br></br>
                      --> 
                    </div>
                  </div>
                  <div class="ln_solid"></div>
                  <div class="form-group">
                    <div class="col-md-6 col-md-offset-3">
                      <button type="submit" class="btn btn-primary">Cancel</button>
                      <button class="btn btn-success" name="btnsubmit">Submit</button>
                    </div>
                  </div>
                </form>
                </div>
              </div>
            </div>
          </div>
    </div>
</div>
      </div>
    </div>
    <script>
    $(document).ready(function(){

       var callAjax = (function(){

        var search = $('#search').val();

        $.ajax({
          url: 'get_users.php',
          dataType: "text",
          type: 'POST',
          data: {search: search},
          success: function(output){
            alert(output);
          }
        });

        }
      });
    </script>

    <?php
    include("footerindex.php");
    ?>

这是我的 get_users.php

    <?php
    include("../db/conn.php");
    $name = $_POST['search'];
    $sql = "select * from product_info where prod_name like '%".$name."%'";
    $array = mysqli_query($conn, $sql) or die(mysqli_error($conn));
    $row = mysqli_fetch_array($array);

    echo $row['prod_name'];


    ?>

这是错误:

注意:未定义索引:在第 3 行的 C:\xampps\htdocs\josephine\admin\get_users.php 中搜索 呸呸呸

它从数据库中返回“ddddd”的数据。我没有得到的是来自 AJAX 的未定义搜索索引

【问题讨论】:

  • 未来注意事项:验证/清理$_POST 以确保其通过。然后,当它没有通过时,错误不会显示。
  • 危险:你很容易受到SQL injection attacks的影响,你需要defend你自己。
  • 在浏览器中检查您的网络选项卡并检查 ajax 请求以查看搜索值是否实际在您的请求中传递到服务器。
  • 你确定你打电话给callAjax()吗?我没有看到任何称呼它的东西。
  • 我没有看到您在哪里提交表单

标签: php ajax undefined-index


【解决方案1】:

要消除错误,您需要执行以下操作:

<?php
include("../db/conn.php");
$name = (isset($_POST['search'])) ? $_POST['search'] : ""; // see this line
$sql = "select * from product_info where prod_name like '%".$name."%'";
$array = mysqli_query($conn, $sql) or die(mysqli_error($conn));
$row = mysqli_fetch_array($array);

echo $row['prod_name'];


?>

PHP 7 解决了这个问题;见:http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

但是你应该改变你的 sql 东西,因为你很容易被注入。

编辑:-1?!?!我真的被触发了。这是处理此问题的正确方法。这不是像拥有超过 300k 代表的人所说的那样“掩盖”它。
阅读:PHP: "Notice: Undefined variable", "Notice: Undefined index", and "Notice: Undefined offset"

使用$_POST$_GET$_SESSION。对于$_POST$_GET,您只需检查索引是否 在你使用它们之前存在与否。

【讨论】:

  • 这只是掩盖了问题。 $_POST['search'] 应该在他进行 AJAX 调用时始终设置。
  • 理想情况下,您应该将整个代码包装在 isset 中,并有一个 else 条件,您可以在该条件下向用户返回一条消息,以便在您的前端和前端填写该字段' d 阻止他们发送空字段。
  • 不管在客户端检查空输入。您仍然需要在服务器上使用它,否则 php 会抛出此问题。在使用 $_GET 和 $_POST 时,它总是有并且总是会。请在您的环境中进行测试。
  • @Barmar 你说“检查空输入最好在客户端完成,所以你根本不发出 ajax 请求。”在改善用户体验方面确实如此,但为了安全/稳健性,它也应该始终在服务器上进行检查,以防恶意用户绕过 UI。服务器端应该是要实现的序列的第一部分,因为它是最重要的。用户体验的好处可以稍后添加。
  • @WillParky93 当输入无效时,正确的做法是报告错误,而不仅仅是用空字符串替换它。
【解决方案2】:

第一个:如果用户提交空字符串意味着您必须通知用户不应该为空。

第二个:尽量使用prepared statement来避免sql注入。

第三:你需要在按钮点击时调用ajax函数。

<button  type="button" id="button_submit" class="btn btn-success" name="btnsubmit">Submit</button>

第 4 次:如果您要返回更多行作为 json 数据,您需要将 dataType 设置为 json

 dataType: "json",

PHP:

 <?php
    include("../db/conn.php");
    if(!empty($_POST['search'])){
    $sql = "select * from product_info where prod_name like '%?%'";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('s',$_POST['search']);
    $res=$stmt->execute();
    if(!$res){ echo $stmt->error; }
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    //here you can use while loop to fetch all the record and do the json_encode() and return all the rows.
    echo $row['prod_name'];

    }else{

      echo "Product search string should not empty ";
    }

    ?>

阿贾克斯:

$(document).ready(function(){

     $(document).on('click','#button_submit',function(){

        var search = $('#search').val();

        $.ajax({
          url: 'get_users.php',
          dataType: "text",
          type: 'POST',
          data: {search: search},
          success: function(output){
            alert(output);
          }
        });
          return false;
      });
  });

【讨论】:

  • 我正在用!empty() 处理这个问题你注意到@WillParky93
  • 没关系 .cool @Script47 无论如何,好的答案会受到一些好心人的赞赏
【解决方案3】:

在您的其中一个按钮中,在单击 callAjax() 函数时调用它,因为您没有类型提交按钮:

<button type="button" class="btn btn-success" onclick="callAjax();"><i class="fa fa-check"></i><span>Go</button>

然后删除文档就绪函数中的 ajax 函数,因为它可能在某些浏览器中未定义:

<script>

        var callAjax = (function(){

        var search = $('#search').val();

        $.ajax({
          url: 'get_users.php',
          dataType: "text",
          type: 'POST',
          data: {search: search},
          success: function(output){
            alert(output);
          }
        });

        });
    </script>

然后按照上面 cmets 的说明处理 sql 注入问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2015-04-06
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多