【问题标题】:Trying to extract 5 characters from a column when adding record mysql via php通过php添加记录mysql时尝试从列中提取5个字符
【发布时间】:2012-06-11 00:32:08
【问题描述】:

我的part_no 列具有以下格式:000-00000-00 用于所有记录。

我需要在创建记录时从part_no 中提取五个中间字符并将其放在core 列中。

我的脚本无法运行。

我没有收到任何错误。只是不工作。

$order = "INSERT INTO cartons_added (add_time, type, part_no, add_type, add_qty, add_ref, add_by, add_notes)
        VALUES
        ('$date',
        '$_POST[type]', 
        '$_POST[part_no]', 
        '$_POST[add_type]', 
        '$_POST[add_qty]', 
        '$_POST[add_ref]', 
        '$_POST[add_by]', 
        '$_POST[add_notes]')";

$result = mysql_query($order);
$query2 = "select part_no from cartons_current";
$sel = mysql_query($query2);
$res = mysql_result($sel);
while($row = mysql_fetch_row($res)) {
    $core_digits = split('-',$row[0]);
    $core =$core_digits[1];
    $query3 = "insert  into cartons_current(core) values($core)";
    $sel2 = mysql_query($query3);
}

【问题讨论】:

  • 您的代码易受 SQL 注入攻击。 Read this asap
  • 请告诉我们您的cartons_current 表的结构。

标签: php mysql post split


【解决方案1】:

您可以根据 cartons_added 表更新您的 cartons_current 表,如下所示:

INSERT INTO cartons_current(core) 
SELECT SUBSTR(part_no, 5, 5) FROM cartons_added

您可能希望使用WHERE 子句来限制它,或者处理当该值已经在cartons_current 中时发生的情况(使用INSERT IGNOREON DUPLICATE KEY UPDATE

【讨论】:

    【解决方案2】:

    你是对的,脚本没有错误。

    我认为问题出在您的 SQL 上,导致您无法插入新行,特别是在表结构上。也许您定义了一个没有AUTO_INCREMENTPRIMARY KEY,定义了一个不是core 键的INDEXUNIQUE 键,或者还有其他一些没有默认值的键。请记住,如果不定义所有必填字段,则无法插入行。

    您的脚本选择了所有part_no,并且对于每个part_no,您都在同一个表中插入了一个新行,所以可能存在问题。

    我认为您想要的是更新每个结果以添加 core 值,您可以使用 UPDATE 来执行此代码:

    function getValue($value) {
      return "'" . trim(mysql_real_escape_string($value)) . "'";
    }
    
    mysql_query('INSERT INTO `cartons_added` (`add_time`, `type`, `part_no`, `add_type`, `add_qty`, `add_ref`, `add_by`, `add_notes`)
                 VALUES (' . 
                  getValue($date) . ', ' .
                  getValue($_POST[type]) . ', ' .
                  getValue($_POST[part_no]) . ', ' .
                  getValue($_POST[add_type]) . ', ' .
                  getValue($_POST[add_qty]) . ', ' .
                  getValue($_POST[add_ref]) . ', ' .
                  getValue($_POST[add_by]) . ', ' .
                  getValue($_POST[add_notes]) . 
                 ')');
    
    $partNoQuery = mysql_query('SELECT `part_no` FROM `cartons_current`');
    
    while($partNoResult = mysql_fetch_assoc($partNoQuery)) {
        list($prefix, $core, $suffix) = explode('-', $partNoResult['part_no']);
        mysql_query('UPDATE cartons_current SET `core` = \'' . $core . '\' WHERE `part_no` = \'' . $partNoResult['part_no'] . '\'');
    }
    

    我添加了 getValue 函数来转义发布的数据以防止 SQL 注入。

    【讨论】:

      【解决方案3】:

      尝试删除它

      $res = mysql_result($sel);
      

      并更改您的 while 以引用主查询资源

      while($row = mysql_fetch_row($sel)) {
      

      不过,我不明白您对表格的逻辑。您正在将数据插入到 cartons_added 表中,但随后您从 cartons_current 中进行选择?

      另外,split 自 PHP 5.3.0 起已弃用

      【讨论】:

        【解决方案4】:

        你说五个中间“字符”,所以我会在你的变量周围添加引号,如下所示:

        $query3 = "insert  into cartons_current(core) values('$core')";
        

        (另外,关于 SQL 注入和使用 pdo 的 SO 上只有无数个答案)

        【讨论】:

          【解决方案5】:
          INSERT INTO cartons_current(core) 
          SELECT 
            substr(part_no,position('-' IN part_no)+1,position('-' IN substr(part_no,position('-' IN part_no)+1))-1)
          FROM cartons_added;
          

          【讨论】:

          • 这个不错。虽然是一个丑陋的查询,但它解释了part_no 的格式可能会略有变化的可能性。
          • 如果你记得的话,查询会稍微不那么难看,MySQL 将每行只计算每个函数一次,即substr(part_no,position('-' IN part_no) 将只计算一次,尽管它被使用了 3 次
          • 我的意思是它看起来并不那么容易(这无济于事,它是 SQL),并不是说它会带来不好的性能。我不是在批评,这实际上是一个非常好的方法。
          猜你喜欢
          • 1970-01-01
          • 2021-03-09
          • 1970-01-01
          • 1970-01-01
          • 2018-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多