【问题标题】:for loop is executed twice but data is saved only once php ajaxfor循环执行两次,但数据只保存一次php ajax
【发布时间】:2018-06-01 16:10:11
【问题描述】:
  <html>
 <head>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
 </head>
 <body onload="searchVideo();">

<script>
 var data_length =  2;
 for(var i=0; i<data_length; i++){
console.log(i);
 var pageToken = '';
  var numOfResult = 0;
 var maxResults = 200;
 function searchVideo(){
   var separator = ',';
    $.getJSON('https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&pageToken=' + pageToken + '&playlistId=PLrEnWoR732-BHrPp_Pm8_VleD68f9s14-&key=Apikey&callback=?',function(data){

    var l = data.items.length;
    pageToken = data.nextPageToken;
    numOfResult += l;
    var itemUrl = '';
      var videoids = [];
         for(var j = 0; j < l; j++) {
          if( j == 0) {
            separator = ',';
          }
          else {
            separator = ',';
          }

            var videoid = data.items[j].snippet.resourceId.videoId;
            var title = data.items[j].snippet.title;
           $.ajax({
                method: 'POST',
               url:    'add.php',
               data: { title: title, videoid: videoid }
                 })
              .done(function(data) {
                });
        }

        if( numOfResult < maxResults) {
          searchVideo();

        }

         });
       }
   }
  </script>
</body>
 </html>

添加.php

<?php
 ini_set('max_execution_time', 300);
include 'config.php';
 $title = mysqli_real_escape_string($mysql,$_POST['title']);
 $videoid = mysqli_real_escape_string($mysql,$_POST['videoid']);
 $thumbnail_url = 'http://img.youtube.com/vi/'.$videoid.'/hqdefault.jpg';
 $sql = "INSERT INTO ytfb(name,video_name,thumbnail_url)    VALUES('$title','$videoid','$thumbnail_url')";
$create_post_query=mysqli_query($mysql,$sql);
     if(!$create_post_query)
    {
   die("Connection failed".mysqli_error($mysql));
     }?>

从上面的代码数据只保存一次。数据没有保存两次,而是运行 for 循环两次以保存数据两次。所以任何人都可以帮助我如何使用ajax两次保存数据。仅保存一次数据后,数据不会保存两次,因为我给定长度 2 表示 2 for 循环它应该保存两次

【问题讨论】:

  • 你的 for 循环执行一次而不是执行 2 次。如果你想执行2次然后j&lt;=1

标签: javascript php ajax for-loop


【解决方案1】:

根据我的 cmets,您的 for 循环执行一次而不是执行 2 次。如果你想执行2次然后j&lt;=1

这一行的问题。我已经解决了问题

for(var j = 0; j <= 1; j++) {

我在本地解决了问题。您的函数 searchVideo 没有执行两次。仅第一次调用 onload 函数。我已经上传了一些代码示例。你应该把这个样本放假

示例代码。去掉函数,写没有函数的代码

  <html>
 <head>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
 </head>
 <body>

<script>
 var data_length =  2;
 for(var i=0; i<2; i++){
    alert(i);
console.log(i);
 var pageToken = '';
  var numOfResult = 0;
 var maxResults = 200;


            var videoid = "asdf";
            var title = "erwe";
           $.ajax({
                method: 'POST',
               url:    'test4.php',
               data: { title: title, videoid: videoid }
                 })
              .done(function(data) {
                });


       }

  </script>
</body>
 </html>

test4.php

<?php
echo "string";
?>

实现该功能的其他方式

 <html>
 <head>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
 </head>
 <body>

<script>
 var data_length =  2;
 for(var i=0; i<2; i++){
    searchVideo();
    alert(i)
console.log(i);
 var pageToken = '';
  var numOfResult = 0;
 var maxResults = 200;
 function searchVideo(){

            var videoid = "asdf";
            var title = "erwe";
           $.ajax({
                method: 'POST',
               url:    'test4.php',
               data: { title: title, videoid: videoid }
                 })
              .done(function(data) {
                });
        }

       }

  </script>
</body>
 </html>

【讨论】:

  • 你不能简单地改变它一个它是L变量你怎么能用1替换它然后我不能从api获得完整的数据
  • l 的值是多少。打印l 并显示详细信息
  • 它的 50 50 50 50 如果最大值是 200 你可以运行一次程序来检查它,它会在 api 中给出视频的长度(多少个视频)
  • 我在本地解决了问题.. 你的函数searchVideo 没有执行两次。我已经上传了一些代码示例。你应该把这个样本放假
  • 我还需要另一个 for 循环,请查看我的代码
【解决方案2】:

试试这个

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
var paylistIdArray=['PLrEnWoR732-BHrPp_Pm8_VleD68f9s14-','PLrEnWoR732-BHrPp_Pm8_VleD68f9s14-'];
var pageToken ='';
var data_length =  paylistIdArray.length;
var numOfResult = 0;
var maxResults = 200;
var i=0;
var paylistId=paylistIdArray[0];
function searchVideo() {
    var separator = ',';
    $.getJSON('https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&pageToken='+pageToken+'&playlistId='+paylistId+'&key= xxxx',function(data){
        console.log(data)
        var l = data.items.length;
        pageToken = data.nextPageToken;
        numOfResult += l;
        var itemUrl = '';
        var videoids = [];
        for(var j = 0; j < l; j++) {
            if( j == 0) {
                separator = ',';
            } else {
                separator = ',';
            }
            var videoid = data.items[j].snippet.resourceId.videoId;
            var title = data.items[j].snippet.title;
           console.log("called");
            $.ajax({
               method: 'POST',
               url:    'add.php',
               data: { title: title, videoid: videoid }
           }).done(function(data) {
           });
        }

        if( numOfResult < maxResults) {
          searchVideo();

        }
        if( numOfResult == maxResults && i<data_length) {
            i++;
            pageToken = ''; 
            numOfResult = 0;
            maxResults = 200;
            paylistId=paylistIdArray[i];
            searchVideo();
        }

    });
}
searchVideo()
</script>

【讨论】:

  • 请让ans变得有用
  • 嘿伙计,如果播放列表有不同数量的视频,你能帮我解决一件事吗
  • 我会检查并通知您。 (10 分钟内)
  • 好的,一旦我得到答案,我会接受答案,我不会再问任何问题,谢谢你的帮助
  • 可以分享你的代码(比如 paylistid 等)我看不到那个场景
【解决方案3】:

不,我们只调用了一次搜索视频功能。(在页面加载时) 从 body 标签中移除 onload 函数 请尝试此代码

<script>

function searchVideo() {
    var separator = ',';
    $.getJSON('https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&pageToken=' + pageToken + '&playlistId=PLrEnWoR732-BHrPp_Pm8_VleD68f9s14-&key=Apikey&callback=?',function(data){

        var l = data.items.length;
        pageToken = data.nextPageToken;
        numOfResult += l;
        var itemUrl = '';
        var videoids = [];
        for(var j = 0; j < l; j++) {
            if( j == 0) {
                separator = ',';
            } else {
                separator = ',';
            }
            var videoid = data.items[j].snippet.resourceId.videoId;
            var title = data.items[j].snippet.title;
            $.ajax({
                method: 'POST',
                url:    'add.php',
                data: { title: title, videoid: videoid }
            }).done(function(data) {
            });
        }

        if( numOfResult < maxResults) {
          searchVideo();

        }

    });
}

var data_length =  2;
var pageToken = ''; 
var numOfResult = 0;
var maxResults = 200;
for(var i=0; i<data_length; i++){
    console.log(i);

    searchVideo();
}



  </script>

但我不知道 searchVideo 函数中的以下条件

if( numOfResult < maxResults) {
          searchVideo();

        }

【讨论】:

  • 它只保存一次第二个条件是从 api 获取所有 200 个视频,因为在一次调用中我们最多只能获取 50 个视频,因此使用 pagetoken
  • @HectorBeck 雅。刚才我读了文件。现在在为每个更改第一个之后它是否工作
  • 它仍然只向数据库中插入 200 条记录而不是 400 条记录,您可以检查一次吗
  • 好的,在获取详细信息后控制台数据。我收到“dailyLimitExceededUnreg”错误
  • 可能是api key过期了
【解决方案4】:

试试这个

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
var pageToken ='';
var data_length =  2;
var numOfResult = 0;
var maxResults = 200;
var i=1;
function searchVideo() {
    var separator = ',';
    $.getJSON('https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&pageToken='+pageToken+'&playlistId=PLrEnWoR732-BHrPp_Pm8_VleD68f9s14-&key= xxxx',function(data){
        console.log(data)
        var l = data.items.length;
        pageToken = data.nextPageToken;
        numOfResult += l;
        var itemUrl = '';
        var videoids = [];
        for(var j = 0; j < l; j++) {
            if( j == 0) {
                separator = ',';
            } else {
                separator = ',';
            }
            var videoid = data.items[j].snippet.resourceId.videoId;
            var title = data.items[j].snippet.title;
           console.log("called");
            $.ajax({
               method: 'POST',
               url:    'add.php',
               data: { title: title, videoid: videoid }
           }).done(function(data) {
           });
        }

        if( numOfResult < maxResults) {
          searchVideo();

        }
        if( numOfResult == maxResults && i<data_length) {
            i++;
          pageToken = ''; 
   numOfResult = 0;
   maxResults = 200;
          searchVideo();

        }

    });
}
searchVideo()
</script>

【讨论】:

  • 嘿,我将有 2 个播放列表,所以我保留了 for 循环,您已将其删除
  • 你的意思是改变getJSON中的playlistId
  • 我需要在循环中第一次动态选择播放列表一个播放列表第二次从数组中选择另一个播放列表所以我需要循环
  • 你的意思是动态改变getJSON中的playlistId
  • 我将在数组中有播放列表,我需要运行它们
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 2014-12-07
  • 2019-06-20
  • 2013-05-29
  • 1970-01-01
相关资源
最近更新 更多