【问题标题】:updating the data using implode in php在 php 中使用 implode 更新数据
【发布时间】:2016-01-01 02:02:02
【问题描述】:

请帮帮我,对我的英语不好表示抱歉, 我已经获取数据,基于我想要更新行的数据, 遵循我的代码

我获取数据以连接 API 参数

<?php 


 $stmt = $db->stmt_init();
                /* publish store for icube*/
  $stmt->prepare( "SELECT id,offer_id,name,net_provider,date,visible,apikey,networkid FROM " ."affilate_offer_findall_icube WHERE visible='1' ");
  $stmt->execute();
  mysqli_stmt_execute($stmt); // <--------- currently missing!!!
mysqli_stmt_store_result($stmt); 
 $rows = mysqli_stmt_num_rows($stmt);
   $stmt->bind_result( $id, $offer_id, $name, $net_provider, $date, $visible,$apikey,$networkid);
    $sql = array();
   if($rows>0)
   {

    while($info = $stmt->fetch() ) {
 $jsondataicube = file_get_contents('filename/json?NetworkId='.$networkid.'&Target=Affiliate_Offer&Method=getThumbnail&api_key='.$apikey.'&ids%5B%5D='.$offer_id.'');
            $dataicube = json_decode($jsondataicube, true);
foreach($dataicube['response']['data'][0]['Thumbnail'] as $key=>$val)
            {
                 $offer_id  = $dataicube['response']['data'][0]['Thumbnail']["$key"]['offer_id'];
                $display = $dataicube['response']['data'][0]['Thumbnail']["$key"]['display'];
                 $filename = $dataicube['response']['data'][0]['Thumbnail']["$key"]['filename'];
                $url  = $dataicube['response']['data'][0]['Thumbnail']["$key"]['url'];
             $thumbnail  = $dataicube['response']['data'][0]['Thumbnail']["$key"]['thumbnail'];
             $_filename = mysqli_real_escape_string($db,$filename);
                  $_url = mysqli_real_escape_string($db,$url);
                $_thumbnail  = mysqli_real_escape_string($db,$thumbnail);
 $sql[] = '("'.$offer_id.'","icube","'.$_thumbnail.'","'.$_url.'")';

            }
        }   

当我存储必须插入“sql”的值时 现在

$stmt->prepare( "SELECT offer_id FROM " ."affilate_offer_getthumbnail_icube ORDER BY 'offer_id' ASC");
$stmt->execute();
mysqli_stmt_execute($stmt); // <--------- currently missing!!!
mysqli_stmt_store_result($stmt); 
$rows = mysqli_stmt_num_rows($stmt);
$stmt->bind_result($offer_id);
$sqlimplode = implode(',', $sql);
if($rows>0)
   { 

        $query = "UPDATE affilate_offer_getthumbnail_icube WHERE offer_id='".$offer_id."' SET '".$sqlimplode."'"; 
         $stmt->prepare( $query);
 $execute = $stmt->execute();
   }
   else
   {
        $query= "INSERT INTO affilate_offer_getthumbnail_icube(offer_id, net_provider,logo2020,logo100) VALUES".$sqlimplode;
         $stmt->prepare( $query);
 $execute = $stmt->execute();
  }`
`

插入查询运行良好,但如何更新所有数据,如插入查询?

【问题讨论】:

  • update like insert query 是什么意思?

标签: php mysql


【解决方案1】:

UPDATE查询的语法是

UPDATE table SET field1 = value1, field2 = value2 ...

因此,您不能将内爆数组 $sql 传递给 UPDATE 查询。您必须为 UPDATE 查询生成另一个 sql 字符串。

【讨论】:

    【解决方案2】:

    这显然是错误的:

     $query = "UPDATE affilate_offer_getthumbnail_icube 
     WHERE offer_id='".$offer_id."' SET '".$sqlimplode."'"; 
    

    如果意图是INSERT offer_id='".$offer_id."',然后是UPDATE ... SET offer_id = '".$sqlimplode."'";

    您必须使用两个单独的查询,一个用于INSERT,另一个用于UPDATE

    一个例子:

     $query = "INSERT INTO affilate_offer_getthumbnail_icube 
     (col_name) VALUES('".$col_Value."')";
     //(execute it first);
    
    $query2 = "UPDATE affilate_offer_getthumbnail_icube SET 
         col_name= '".$col_Value."'" WHERE if_any_col = 'if_any_Value';
     //(execute this next);
    

    【讨论】:

      【解决方案3】:

      我的回答是指“一劳永逸”的策略。我不想先查找现有行 - 可能使用 PHP。我只想创建正确的 SQL 命令并发送它。

      有几种方法可以更新已经输入(或丢失)的数据。首先,您应该更改您的表以设置特定于问题的 UNIQUE-Key。这为您的表设置了更多的智能,以自行检查已插入的数据。以下更改意味着在此 UNIQUE-set 列中不能有两次具有相同值的第二行。 如果发生这种情况,您会得到一些错误或特殊行为。

      您可以使用此命令来设置列的唯一性,而不是使用 PHPMyAdmin:

      ALTER TABLE `TestTable` ADD UNIQUE(`tablecolumn`);
      

      使用这种额外的智能设置您的表格后,您可以稍微更改一下您的 Insert-Command:

      您可以删除并覆盖您的数据行,而不是插入 REPLACE

      $query= "REPLACE INTO affilate_offer_getthumbnail_icube 
      (offer_id, net_provider,logo2020,logo100) VALUES (".$sqlimplode.")";
      

      见:Replace Into Query Syntax

      其次,您可以使用“On Duplicate Key”-Commando 来执行此操作。

      https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

      $query= "INSERT INTO affilate_offer_getthumbnail_icube 
      (offer_id, net_provider,logo2020,logo100) 
      VALUES (".$sqlimplode.") 
      ON DUPLICATE KEY UPDATE net_provider = ".$newnetprovider.", 
                              logo2020 = ".$newlogo2020.", 
                              logo100 = ".$newlogo100.";";
      

      注意: 我认为您在 $sqlimplode 周围遗漏了一些 ( 和 )。我总是把它们放在你的内爆周围。也许您在字符串周围也缺少 ' '。

      【讨论】:

      • 但是我又有一个查询,如果我将唯一键输入到商品 ID 但相同商品 ID 的值可能不同,那么它应该显示。
      • 在每种情况下,您都必须指定数据行中必须唯一的内容。您可以将 ONE 列指定为 Unique 或 MORE 列。 ONE 的示例:您可以告诉您的表只能有不同的名称。然后插入一些行,如ID = 1name=nehaJyear=2000。稍后您插入ID = 23name=nehaJyear=2005。然后您将替换或更新旧的 ID = 1 可能会被删除。多个示例:如果您将您的表设置为 NAME+YEAR 唯一,那么您的表中将有 ID=1 和 ID=23。因为 nehaJ+2000 不等于 nehaJ+2005。回答了吗?
      • 我曾经为一个浏览器游戏做过一些数据收集。有带有 AccountID 的用户名。我用日期保存了所有这些。我将用户名列和用户 ID 列设为唯一。 (这是一个覆盖两列的唯一索引。)后来我更新了这个数据存储。当一个帐户被玩家重命名时,我有一个新的用户名和用户 ID 元组,然后它被插入到我的数据库中,并带有时间戳。所以我能够很容易地跟踪重命名。当我更新时:通常 10000 次插入失败,row already exists 只有新的插入。
      • 让我有两列 1 是商品 ID,另一列是类别..当行插入值为 1) 商品 id=2 ,类别 = 市场 2) 商品 id=2 时,我现在添加唯一键categories = ecommerce, 然后变成 offer_id= 2 , categories = ecommerce.I want both values
      • 其实我是从 api.so 调用这个的
      【解决方案4】:

      试试这个:

      $sqlimplode = implode(',', $sql);
      if($rows>0)
         { 
              /*$fields_values = explode(',',trim(array_shift($sql), "()"));
              $combined_arr = array_combine(['offer_id','net_provider','logo2020','logo100'],$fields_values);
              $sqlimplode = implode(', ', array_map(function ($v, $k) { return $k . '=' . $v; }, $combined_arr, array_keys($combined_arr))); */
              $query = "INSERT INTO affilate_offer_getthumbnail_icube(offer_id, net_provider,logo2020,logo100) VALUES".$sqlimplode." ON duplicate key update net_provider = values(net_provider),logo2020 = values(logo2020),logo100 = values(logo100)"; 
               $stmt->prepare( $query);
       $execute = $stmt->execute();
         }
         else
         {
              $sqlimplode = implode(',', $sql);
              $query= "INSERT INTO affilate_offer_getthumbnail_icube(offer_id, net_provider,logo2020,logo100) VALUES".$sqlimplode;
               $stmt->prepare( $query);
       $execute = $stmt->execute();
        }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 2017-04-28
      • 2012-04-09
      • 1970-01-01
      相关资源
      最近更新 更多