不可阻挡的循环X(

时间:2015-04-22 17:13:54

标签: php mysql wordpress

这实际上是我的第一个代码。我试图在我的Wordpress网站上添加新帖子。
Mysql查询将返回4035行,其中包含插入新帖子的所有详细信息。
问题:循环永远不会停止! 它将达到4035行,然后从第1行开始遍布

我试图让它停止的事情:

  1. 已添加 - if ($loopstimes > 4400) {break;}
  2. 限制mysql查询到4050行
  3. 奇怪的部分:

    1. 当我将mysql查询限制为LIMIT 900时,一切正常完美。当添加900帖子时,循环停止,如果我添加950,该脚本将添加943个帖子,然后将给我Fatal error "Maximum execution time reached"。然后脚本停止。
    2. 我将“最长执行时间”增加到 300秒,并将内存从128增加到256MB,我使用没有LIMIT的查询,然后循环不会停止。
    3. 我的代码有问题吗?或者是服务器问题?

      <?PHP 
      $username = "xxxx";
      $password = "xxxx";
      $hostname = "localhost"; 
      
      $loopstimes = 0;
      
      //connection to the database
      $dbhandle = mysql_connect($hostname, $username, $password) 
      or die("Unable to connect to MySQL");
      
      //select a database to work with
      $selected = mysql_select_db("xxxx_xxxx",$dbhandle) 
      or die("Could not select examples");
      
      //execute the SQL query and return records
      // Query to get all names
      $result = mysql_query("SELECT DISTINCT names_list.* ... LIMIT 4050");
      
      if($result === FALSE) { 
          die(mysql_error()); // TODO: better error handling
      }
      
      //fetch the data from the database
      while ($row = mysql_fetch_array($result)) {
          $p_name= $row["p_name"];
          $category= $row["gcategory"];
          $subcategory= $row["subcategory"];
          $ase_date= $row["ase_date"];
      
          //Fix the (') to prepare it for mysql query
      
          $pp_name = $p_name; 
          $newp_name = str_replace("'","''",$p_name);
      
          //Query to count results
          $minprice = mysql_query("SELECT ... WHERE Product_p_name = '$newp_name' AND ORDER BY product_price_usd");
          $countss = mysql_num_rows($minprice);
      
          if($minprice === FALSE) { 
              die(mysql_error()); // TODO: better error handling
          }
      
          $rowm = mysql_fetch_array($minprice);
          $minprice = '$'.$rowm["product_price_usd"];
      
          // Create post object
          $my_post = array(
              'post_title' => 'My title...',
              'post_status' => 'publish',
              'post_author' => 1
          );
      
          // Insert the post into the database
          $post_id = wp_insert_post( $my_post );
      
          // Add Advanced Custom field values
          update_field( "field_552fc3f84b43r", $p_name, $post_id ); 
      
          //Regex the date to keep just the year
          if (preg_match("/20.*/", $ase_date, $matches)) {
              $ase_year = $matches[0];
          }
      
          //Insert Tags for Custom Taxonomies
      
          wp_set_post_terms( $post_id, $audio_subcategory, 'subcategory-cpt', false );
          wp_set_post_terms( $post_id, $fex_pro_rg, 'fex-pro-cpt', false );
      
          $loopstimes++;
      
          if ($loopstimes > 4400) {break;}
          echo 'Post added!, '.$post_id.'<br>';
          echo $loopstimes;
      }
      
      //close the connection
      mysql_close($dbhandle);
      echo 'Finish';
      ?>
      

2 个答案:

答案 0 :(得分:0)

当然,您已经知道不应再使用mysql_*功能了。

但是,现在就帮助你解决问题:

//Query to count results
$minprice_query_result = mysql_query("SELECT ... WHERE Product_p_name = '$newp_name' AND ORDER BY product_price_usd");
$countss = mysql_num_rows($minprice_query_result);

if($minprice_query_result === FALSE) { 
    die(mysql_error()); // TODO: better error handling
}

$rowm = mysql_fetch_array($minprice_query_result);
$minprice = '$'.$rowm["product_price_usd"];

mysql_free_result ( $minprice_query_result );

顺便说一句,你为什么需要这个子查询?获得$minprice = '$'.$rowm["product_price_usd"];?但是你永远不会在你的代码中使用那个变量!

答案 1 :(得分:0)

我使用XAMPP运行脚本,它完美无缺。对我来说,这意味着我的代码是正确的,问题出在主持人身上。 我解决这个问题的方法是LIMIT 500并更新mysql查询以排除已经分配的帖子的名称。然后我运行脚本X次,直到所有名称都被分配到帖子。

BTW我从mysql_ *改为mysqli_ * 谢谢你的建议!