【问题标题】:How to fetch single row/data from Mysql_fetch_array?如何从 Mysql_fetch_array 中获取单行/数据?
【发布时间】:2023-04-10 16:55:01
【问题描述】:

我正在使用 fgetcsv() 通过 PHP 读取 .csv 文件。现在我可以获取我的意思是从 .csv 文件中读取数据。 然后我需要用我的获取结果检查 SKU 列,因此必须执行插入或更新。 假设 SKU 已经存在,那么我必须更新表中的行,否则我需要插入新记录。 我已经编写了以下代码...请检查 n 告诉我我在哪里做错了-:

<?php
$row = 1; 
if (($handle = fopen("localhost/data/htdocs/magento/var/import/Price.csv", "r")) !== FALSE) 
{     
    while (($data = fgetcsv($handle, 8000, ",")) !== FALSE) 
    {         
        $num = count($data);         
        echo "<p> $num fields in line $row: <br /></p>\n";           
        for ($c=0; $c < $num; $c++) 
        {             
            $temp = $data;             
            $string = implode(";", $temp);           
        }
            $pieces = explode(";", $string);             
            $col1 = $pieces[0];  
            $col2 = $pieces[1];
            $col3 = $pieces[2];      
            $col4 = $pieces[3];             

            $db_name = "magento";
                        $con = mysql_connect("localhost", "magento", "password");
                     If (!$con)
            {
                die('Could not connect: ' . mysql_error());
                mysql_close($con);
            }
            $seldb = mysql_select_db($db_name, $con);

            $query_fetch = "SELECT `sku` from `imoprt_prices`";
            $result_fetch = mysql_query($query_fetch);
            $num_rows = mysql_num_rows($result_fetch); 

            for($i = 0; $i < $num_rows; $i++) 
            { 
                $value = mysql_result($result_fetch, i, 'sku');
                if(strcmp('".$value."', '".$col2."') == 0)
                {               
                    $flag = 1;
                    break;
                }
                else
                {
                    $flag = 0;
                        break;
                }
            }
                if($flag == 1)
                {
                    $query_upadte = "(UPDATE imoprt_prices SET customer_id= '".$col1."', sku ='".$col2."', price= '".$col3."', website= '".$col4."'
                    )";
                    mysql_query($query_upadte);
                        $row++;         
                }
                if($flag == 0)
                {
                    mysql_query("INSERT INTO `imoprt_prices`(`customer_id`,`sku`,`price`,`website`) VALUES('".$col1."','".$col2."','".$col3."','".$col4."')");
                    $row++;   
                } 

    } 
} 
?>

【问题讨论】:

  • SKU 上是否有唯一索引以避免重复?或者可以加一个吗?
  • SKU 是独一无二的...这就是为什么需要更新现有 SKU...
  • 运行时遇到什么错误?
  • 您是否在 SKU 列上定义了唯一键?
  • no...我还没有为 SKU 列定义唯一性... .CSV 文件是否仅包含 20 行,插入了数千行。我应该将 SKU 设为唯一吗? N 我的猜测是它不适合 Update 语句意味着它总是检查 Flag=0。

标签: mysql magento row fetch fgetcsv


【解决方案1】:

如果您的imoprt_prices 表上有一个实际的UNIQUE 索引,您可以使用ON DUPLICATE KEY UPDATE 语法并将您的代码简化为类似于以下内容; (注意,不能测试,所以看成伪代码)

$db_name = "magento";
$con = mysql_connect("localhost", "magento", "password") or die(mysql_error());
$seldb = mysql_select_db($db_name, $con);

if (($handle = fopen("localhost/data/htdocs/magento/var/import/Price.csv", "r")) !== FALSE) 
{     
    while (($data = fgetcsv($handle, 8000, ",")) !== FALSE) 
    {
        $col1 = $pieces[0];  
        $col2 = $pieces[1];
        $col3 = $pieces[2];      
        $col4 = $pieces[3]; 

        $query_upadte = "INSERT INTO imoprt_prices (customer_id, sku, price, website) ".
            "VALUES('".$col1."','".$col2."','".$col3."','".$col4."') ".
            "ON DUPLICATE KEY UPDATE customer_id='".$col1."', price='".$col3.
            "',website='".$col4."'";
        mysql_query($query_upadte);
    }
}

您可能还想使用mysql_real_escape_string() 或使用参数化查询来确保插入的值中没有'。像这样构建 sql 字符串总是很危险的。

简单演示here.

【讨论】:

  • 嗨,你的意思是为整个表 import_prices 设置唯一索引还是为 SKU 列设置唯一约束,即我们正在检查条件的列..
  • @Prat 只为SKUON DUPLICATE KEY UPDATE 所做的是尝试插入,如果由于唯一索引(SKU 重复)而导致插入失败,则会更新现有行。
【解决方案2】:

在下面的sn-p中:

$query_upadte = "UPDATE imoprt_prices SET customer_id= '".$col1."', sku ='".$col2."', price= '".$col3."', website= '".$col4."'";

您正在尝试重复更新所有行,而不是仅更新一行。这在 MySQL 中通常是不允许的。您需要指定要更新的特定unique ID。

【讨论】:

  • 我正在检查 If() 中的条件,然后设置标志以触发更新查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2014-01-02
相关资源
最近更新 更多