【问题标题】:Code you're using to insert data into mysql database用于将数据插入 mysql 数据库的代码
【发布时间】:2011-04-16 04:03:38
【问题描述】:

请在回答或点击“关闭”链接之前仔细阅读此问题。
这个问题是关于分享经验,交流技巧和窍门的。

您使用什么代码将数据插入到 mysql 数据库中?

只是您实际项目中的一小段代码。最好是 CRUD 类型。
我的意思是真实代码。 请不要从手册中复制粘贴代码示例。这与现实生活的需求不同。请不要回答“您可以使用这些方法……”。我都认识他们。我要求的不是方法,而是真正的编码经验。

我觉得分享你的代码非常有趣,非常有启发性,可以从其他人的经验中学习。

请注意,代码必须完整,包括所有数据准备。但如果可能的话,没有验证。如果后台工作太多(如模型初始化等),可以省略后台工作。比起复制和粘贴代码,我更需要深思熟虑。

请不要太快结束这个话题。
我渴望真实世界的代码示例,这里很少,但到处都是虚拟代码 sn-ps。

欢迎使用 PHP 以外的语言,以及任何 ORM 或框架的使用。但是请记住——不是从文档示例中复制粘贴,而是从您自己的项目中复制粘贴。差别很大。

【问题讨论】:

  • 你能把它做成CW吗?显然,您的问题没有一个正确答案。
  • 你找到向mysql插入数据的最佳方法了吗?如果是,请从下面的列表中选择哪一个?否则加一并标记为答案。泰。

标签: php mysql


【解决方案1】:

这是Redbean ORM。我所做的基本上是将我自己的代码包装在它的域对象周围,因此它看起来像

 class Book extends RedBean_DomainObject
   {
       public function __construct($id)
       {
           if ($id!=0)
             $this->find($id);               
       }

       public function save_details($author, $title)
       { 
            // insert OR update new entry
            $this->author = $author;
            $this->title = $title;
            $this->save(); 
        }
   }

代码将检查“bean”是否存在;如果是,它将加载它。您将属性分配给类,并调用 save() 方法将其保存到 bean。 RedBean ORM 会自动检测是保存还是更新。 注意:不过,RedBean 域对象已被更好的东西所取代。

我也在使用 WordPress wp-db,我喜欢它的语法

 $wpdb->insert("books", array('title' => $title, 'author' =>$author));

我找到了一个little wrapper online,它也允许我在重复键上插入...。

$wpdb->insert_on_duplicate("author_book_relationship", 
                          array('book_id' => $book_id,
                                'date_published' =>$date_published),
                          array('book_id' => $book_id));

第一个参数是表,第二个是插入/更新信息,最后一个是UPDATE部分的where子句。

编辑

我通常将 SQL 函数包装在帮助程序中

class BookHelper
{
    public function save_relationship($id, $book, $author)
    {
       global $wpdb;

       $wpdb->insert_on_duplicate("author_book_relationship", 
                          array('book_id' => $book_id,
                                'date_published' =>$date_published),
                          array('book_id' => $book_id));
    }
}

在策略内部

class BookSaveStrategy
{
     protected $book_helper;

     public function save_relationship($id, $book, $title)
     {
          // validate id, book and title
          //.....
          // Save if ok
          $this->book_helper->save_relationship($id, $book, $title);
     }
}

可以在控制器中使用

if (isset($_POST['save_book']))
{
    $book_save_strategy->save($_POST['id'], $_POST['author'], $_POST['title']);
}

【讨论】:

  • 你必须在某处获得这些 $title 和 $author。要获得完整的图片,还有一些其他代码
【解决方案2】:

我的框架的 ORM:

$User = new User();
$User->name = 'John';
$User->email = 'john@example.com';
$User->homepage = 'http://example.com';
$User->save();

保持简单、轻量和有效。

【讨论】:

  • 如果有十几个字段,写这些数据就很无聊了。我希望有一些帮手可以使这个例程自动化一点。但我不得不承认,它看起来非常清晰和简单。 +1
  • 还有一个用于批量插入的关联数组语法。
  • Lotus,我们可以私聊吗?我向上帝发誓,我写了一个完全像这样工作的系统,当然没有外部帮助。
【解决方案3】:

使用ADOdb

$stmt = $db->Prepare("INSERT INTO `table` (`column1`, `column2`, `column3`) VALUES (?, ? ,?)");

$insert = $db->Execute($stmt, array($value1, $value2, $value3));

if($insert === false) throw new Exception($db->ErrorMsg());

【讨论】:

    【解决方案4】:

    以下是我们公司框架中的一些示例。

    原始查询:

    Db::query(
        "UPDATE sometable SET city = %s, region = %s WHERE id = %d",
        $city, $region, $id);
    
    // or
    
    Db::query(
        "UPDATE sometable SET city = %(city)s, region = %(region)s WHERE id = %(id)d",
        array('city' => $city, 'region' => $region, 'id' => $id));
    

    支持许多占位符,例如%s(字符串)、%d(整数)、%f(浮点数)、%?(自动检测参数类型)、%- (没有转义,按原样插入)甚至%as%ad 等(字符串/整数/其他数组,替换为逗号分隔值)。一切都在幕后妥善逃脱。

    还有一些功能非常有限的 ORM:

    $city = !empty($id) ? City::fetchOneById($id) : City::create();
    $city->setValues(array('city' => $city, 'region' => $region));
    $city->save();
    

    【讨论】:

      【解决方案5】:

      取自最近项目模型的函数(使用 Codeigniter)。它习惯于 在日历和跟踪表中插入一段假期 变化(减去休假,加上系统每月添加)。

      DateIterator 是一个自定义迭代器,它以格式返回连续日期 yyyy-mm-dd, work_days 是一个自定义助手,用于计算 - 呃 - 数量 两个提供日期之间的工作日。为意大利变量名道歉。

      function richiesta_ferie($utente, $inizio, $fine) {
          // INSERT INTO Ferie
          $data = array(
              'ID_Utente' => $utente,
              'Richiesta' => date('Y-m-d H:i:s'),
              'Inizio'    => $inizio,
              'Fine'      => $fine,
              'Stato'     => 'P',
          );
          $this->db->insert('Ferie', $data);
      
          $ID_Ferie = $this->db->insert_id();
      
          // INSERT INTO Variazione
          $work_days = -1 * work_days($inizio, $fine);
          $data = array(
              'ID_Richiesta' => $ID_Ferie,
              'ID_Utente'    => $utente,
              'Giorni'       => $work_days,
          );
          $this->db->insert('Variazione', $data);
      
          // INSERT INTO Giorno
          // DateIterator defined in helpers/MY_date_helper.php
          $DateIterator = new DateIterator($inizio, $fine);
          foreach ( $DateIterator as $date ) {
              // skip sundays
              if ( date('w', strtotime($date)) == 0 ) {
                  continue;
              }
              $data = array(
                  'ID_Utente'     => $utente,
                  'ID_Richiesta'  => $ID_Ferie,
                  'TipoRichiesta' => 'F',
                  'Giorno'        => $date,
                  'Stato'         => 'P',
              );
              $this->db->insert('Giorno', $data);
          }
      }
      

      【讨论】:

        【解决方案6】:
        try {
        $pSt = $dbh->prepare('INSERT INTO voucher (field1, field2, field3) VALUES (:field1, :field2,:field3)');
        
        $pSt->execute(array(':field1'=>$field1, ':field2' =>$field2,':field3'=>$field3));
        $status=$pSt->errorCode();
        if($status=='00000'){
        echo "Voucher $voucher created successfully.";
        }else{
        $error=$pSt->errorInfo();
        echo $error[2];
        }
        } catch (Exception $e) {
          echo "Failed: " . $e->getMessage();
        }
        

        更改了字段名称。否则这是我使用的代码。

        【讨论】:

        • 每个字段名写四遍你不觉得很无聊吗?特别是如果有 15-20 个?
        • @Col。弹片要了我的命,但都是以“安全”的名义!
        • 但这项工作可以自动化。见stackoverflow.com/questions/3773406/…
        • 这里可以即时通讯。但对不起,我对图像处理一无所知。不过很有趣的问题。
        【解决方案7】:

        这是我的一个脚本中的一个示例:

        $fields=array('city','region');
        if ($id=intval($_POST['id'])) {
          $query="UPDATE $table SET ".dbSet($fields)." WHERE id=$id";
        } else {
          $query="INSERT INTO $table SET ".dbSet($fields);
        }
        dbget(0,$query);
        

        dbSet() 是一个辅助函数,用于从 $_POST 数组和包含字段名称的数组中生成 SQL SET 语句,考虑到使表单字段名称等于表字段名称。

        dbget() 是一个运行查询的函数,0 表示返回值的原始类型,以防在后续代码中需要它。

        【讨论】:

          【解决方案8】:
          public static function insertSQL($table, $fields, $values)
          {
              if (self::$_databaseLogger == null) { self::$_databaseLogger = &LoggerManager::getLogger('databaseAccess'); }
          
              $fieldCount = count($fields);
              $valueCount = count($values);
          
              if ($fieldCount != $valueCount) {
                  self::$_databaseLogger->error('database.insertSQL() Error: field list is different size to value list');
                  throw new Exception("Database::insertSQL field list is different size to value list");
              } else {
                  $sql = 'INSERT INTO '.$table.' ('.implode(', ',$fields).') VALUES ('.implode(', ', $values).')';
                  self::$_databaseLogger->databaseQuery('database.insertSQL(): '.$sql);
                  $statement = database::getDBConnection()->prepare($sql);
          
                  $insertedRows = $statement->execute();
                  if ($insertedRows === False) {
                      self::$_databaseLogger->error('database.insertSQL(): insertSQL ERROR');
                      throw new Exception('database::insertSQL ERROR');
                  }
                  self::$_databaseLogger->databaseResult('database.insertSQL(): Inserted '.$insertedRows.' rows');
          
                  return $insertedRows;
              }
          }   //  function insertSQL()
          

          在调用 insertSQL() 方法之前,所有数据值都经过验证、在适合字符串的地方引用并转义。使用的记录器是 log4PHP。

          编辑

          用例:

          $fileTreeTableFieldsArray = array ( 'FILE_ID',
                                              'FILE_TYPE',
                                              'FILE_NAME',
                                              'FILE_PARENT_ID',
                                              'FILESIZE',
                                              'CREATED_BY',
                                              'CREATED_ON',
                                              'APPLICATION_CONTEXT' );
          
          $fileTreeTableValuesArray = array ( database::getSQLValueString($this->_fileID,'int'),
                                              database::getSQLValueString($fileType,'text'),
                                              database::getSQLValueString($name,'text'),
                                              database::getSQLValueString($parentID,'int'),
                                              database::getSQLValueString($fileSize,'int'),
                                              database::getSQLValueString($_SESSION["USERID"],'int'),
                                              database::getSQLValueString('sysdate','datetime'),
                                              database::getSQLValueString($_SESSION["APPLICATION"],'int') );
          
          Database::startTransaction();
          try {
              $result = database::insertSQL('RCD_FILE_TREE',
                                            $fileTreeTableFieldsArray,
                                            $fileTreeTableValuesArray);
          } catch (Exception $e) {
              Database::rollback();
              $error = $this->_setError(baseFileClassInsertException, $this->_fileCategory, $this->_fileName, $sql, $e->getMessage());
              $this->_logger->error($this->_ErrorMessage);
              return $error;
          }
          Database::commitTransaction();
          

          【讨论】:

          • 它似乎是一个后端。可以添加一个使用示例吗?
          猜你喜欢
          • 2013-09-15
          • 1970-01-01
          • 1970-01-01
          • 2011-07-07
          • 2023-04-10
          • 2013-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多