你正在使用的代码将数据插入MySQL数据库

3
请在回答或点击“关闭”链接之前仔细阅读本问题。此问题涉及分享经验、交流技巧。
您使用什么代码将数据插入MySQL数据库?请提供来自真实项目的代码片段,最好是CRUD类型的。我指的是真实代码。请不要复制粘贴手册中的代码示例。那与真实需求不同。请不要回答“您可以使用这些方法……”。我都知道。我询问的不是方法,而是真实编码经验
分享代码并从他人的经验中学习非常有趣和启发性。请注意,代码必须完整,包括所有数据准备工作。但如果可能的话,请省略后台工作(如模型初始化等)的验证。我更多地是寻求思路,而不是复制和粘贴的代码。
请不要太快关闭此主题。我渴望真实世界的代码示例,在这里很少见到它们,但到处都是虚假的代码片段。
除PHP之外的其他语言以及任何ORM或框架的使用都受到欢迎。但请记住-不要从文档示例中复制粘贴,而要从您自己的项目中获取。这有很大的区别。

1
请将其转为 CW,谢谢。显然对于你的问题并没有一个正确的答案。 - Piskvor left the building
你找到了最好的将数据插入MySQL的方法吗?如果是,请从下面的列表中选择一个。否则,请添加一种并标记为答案。谢谢。 - abel
8个回答

2

我的框架ORM:

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

保持简单、轻量、高效。


如果有超过十几个字段,写入所有这些数据会变得相当无聊。我希望有一些助手能够自动化这个例行程序。但我必须承认,它看起来非常清晰和简单。+1 - Your Common Sense
还有一种用于批量插入的关联数组语法。 - Lotus Notes
莲花,我们可以私下谈吗?我向上帝发誓,我编写了一个系统,完全不需要外部帮助,它就像这个一样。 - Christian

2
这里有一个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 Domain Object已被更好的替代物所取代。
我也正在使用WordPress wp-db,并且我喜欢这种语法。
 $wpdb->insert("books", array('title' => $title, 'author' =>$author));

我发现了一个在线小包装器,可以让我执行INSERT...ON DUPLICATE KEY。
$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。为了获得完整的图片,还需要一些其他的代码。 - Your Common Sense

1

使用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());

0
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个的话? - Your Common Sense
@ Col. Shrapnel这让我非常不爽,但一切都是为了“安全”! - abel
2
但是这项工作可以自动化。请参见https://dev59.com/SW865IYBdhLWcg3whe9f#3921798。 - Your Common Sense
在这里聊天没问题。但很抱歉,我对图像处理一无所知。不过这是一个有趣的问题。 - Your Common Sense

0
以下是我们公司框架的一些示例。
原始查询:
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();

0

这是从最近一个项目的模型中提取的函数(使用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);
    }
}

-1

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

$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 表示返回值的原始类型,在进一步的代码中可能需要使用。


-1
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();

似乎是后端。你能添加一个使用示例吗? - Your Common Sense

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接