Joomla提供两种方式来插入记录,一种是SQL,一种是对象的方法
JDatabaseQuery
类提供了一些方法来方便构建插入的SQL查询语句,其中最常用的就是insert ,columns,values
.典型的使用代码如下:
// 得到数据库链接对象 $db = JFactory::getDbo(); // 创建一个查询对象 $query = $db->getQuery(true); // 准备插入的行 $columns = array('user_id', 'profile_key', 'profile_value', 'ordering'); // 准备需要插入的值 $values = array(1001, $db->quote('zmax99.com'), $db->quote('Inserting a record using insert()'), 1); // 构建插入的查询语句. $query ->insert($db->quoteName('#__zmax_user')) ->columns($db->quoteName($columns)) ->values(implode(',', $values)); // 设置查询并且执行. $db->setQuery($query); $db->execute();
在上面的代码中使用了 quotename()
方法 ,这个方法的作用是添加引号。在书写查询语句的时候,在表名或者字段名上加上引号,可以避免和数据库的保留字冲突。
当插入完成后,通过调用insertid
方法获得插入的ID.代码如下:
// 得到刚刚插入记录的ID $new_row_id = $db->insertid();
如果字段的默认值为NULL,那么你在插入的时候就不要设置这个字段名,让数据库系统字段给他赋值NULL
.如果你的字段默认值不是NULL,且该字段允许值为NULL
,那么你需要明确的在代码中指定插入NULL
.代码如下:
// 得到数据库链接对象 $db = JFactory::getDbo(); // 创建一个查询对象 $query = $db->getQuery(true); // 准备插入的行 $columns = array('user_id', 'profile_key', 'profile_value', 'ordering'); // 准备需要插入的值 $values = array(1001, $db->quote('zmax99.com'), $db->quote('NULL'), 1); // 构建插入的查询语句. $query ->insert($db->quoteName('#__zmax_user')) ->columns($db->quoteName($columns)) ->values(implode(',', $values)); // 设置查询并且执行. $db->setQuery($query); $db->execute();
JDatabaseDriver
类提供了一个不需要写任何SQL语句就可以插入记录的方法。代码如下:
// 创建一个对象 $profile = new stdClass(); $profile->user_id = 1001; $profile->profile_key='zmax; $profile->profile_value='Inserting a record using insertObject()'; $profile->ordering=1; // 插入对象到zmax_user表中. $result = JFactory::getDbo()->insertObject('#__zmax_user', $profile);
注意,在上面并没有使用quoteName方法来给表名加上引号,这是因为 insertObject
方法会自动的帮我们做这一操作。
在执行插入的过程中,如果出现错误,insertObject
方法会抛出一个错误。如果你的数据表中设置了主键值,那么建议你在执行插入之前,先检查这个主键值是否存在,这样可以避免不必要的麻烦。
insertObject
方法支持第三方个参数,这个参数为表的主键名。当你指定了这个参数后,在插入完成后,会更新对象,将主键值设置到对象上面去。可以使用这种方式获得插入的ID.
$result = $dbconnect->insertObject('#__my_table', $object, 'primary_key');
上面的代码执行完成后,$object->primary_key
的值将被更新为插入记录的ID
.
提示:在插入之前需要将$object->primary_key
设置为 null
或 0
如果字段的默认值为NULL
,那么你的对象不加上这个属性就可以了,让数据库系统字段给他赋值NULL
.如果你的字段默认值不是NULL
,且该字段允许值为NULL
,那么你需要明确的在代码中指定插入NULL.代码如下:
// 创建一个对象 $profile = new stdClass(); $profile->user_id = 1001; $profile->profile_key='zmax; $profile->profile_value = $db->quote('NULL'); $profile->ordering=1; // 插入对象到zmax_user表中. $result = JFactory::getDbo()->insertObject('#__zmax_user', $profile);