$insertsql = "";
$insertsql .= "INSERT INTO table";
$insertsql .= "(tag,month_interval,month_interval_lastupdated,date_due,date_due_lastupdated,date_completion,date_completion_lastupdated,";
$insertsql .= "activeNotification,date_lastmodified) ";
$insertsql .= "VALUES (?,?,Now(),?,Now(),?,Now(),?,Now())";
但有时这些问号中的一些不会被设定.
是否有一个关键字我可以在准备好的语句中替换,告诉MysqL插入默认值?
就像是:
if($stmt = $MysqLi->prepare($insertsql)) {
if(!isset($tag)) {
// code to find first question mark and replace w/ default value
}
$stmt->bind_param('sisss',$tag,$month_interval,$date_due,$date_completion);
$stmt->execute();
}
日期字段的默认值为“1000-01-01 00:00:00”,month_interval的默认值为0,其余字段的默认值为NULL.
解决方法:
通过快速搜索,我没有找到任何预定义的解决方案,但我将在接下来的几天继续搜索.
我已经详细说明了解决方案,但它有点扭曲而且不完全干净.
首先,我用占位符重新定义查询:
$query = "
INSERT INTO table
(
tag,
month_interval,
month_interval_lastupdated,
date_due,
date_due_lastupdated,
date_completion,
date_completion_lastupdated,
activeNotification,
date_lastmodified
)
VALUES (<tag>,<month_interval>,Now(),<date_due>,Now(),<date_completion>,Now(),<activeNotification>,Now())
";
在这个例子中,我使用<>围绕占位符,但您可以选择首选占位符,确保它们不会与查询的其他元素混淆.
然后,我初始化一个关联数组,其中键作为占位符名称和要绑定的值,以及一个带有完整绑定类型集的变量($types):
$values = array( 'tag'=>$tag, 'month_interval'=>$month_interval, 'date_due'=>$date_due, 'date_completion'=>$date_completion, 'activeNotification'=>$activeNotification );
$types = 'sisss';
然后,最重要的一句话.我以这种奇怪的方式初始化一个数组:
$bind = array( Null, '' );
索引0设置为Null,因为是为stmt对象保留的(在下面创建);索引1是一个空字符串,将填充必要的绑定类型.
现在我执行一个foreach循环遍历数组$values的所有元素:
$i = 0;
foreach( $values as $key => $val )
{
if( is_null( $val ) )
{
$query = str_replace( '<'.$key.'>', 'DEFAULT', $query );
}
else
{
$query = str_replace( '<'.$key.'>', '?', $query );
$bind[1] .= $types[$i];
$bind[] = &$val;
}
$i++;
}
在该循环中,如果值为null,则使用MysqL关键字DEFAULT替换相应查询的占位符.否则,我用一个?替换占位符,我将相应的$types子字符串添加到$bind [1],然后将值(通过引用)附加到$bind数组.
此时,真正的查询已准备就绪,我可以准备它:
$stmt = $db->prepare( $query ) or die( $stmt->error );
并且,如果没有默认值(count($bind)> 2),我可以绑定它:
if( count($bind)>2 )
{
$bind[0] = $stmt;
call_user_func_array( 'MysqLi_stmt_bind_param', $bind );
}
如前所述,我将$bind [0]设置为由> prepare返回的stmt对象,然后我使用call_user_func_array来执行MysqLi_stmt_bind_param.我不能直接调用 – > bind_param因为我有一个变量参数号.
$stmt->execute() or die( $stmt->error );
我已经测试了这段代码,但它确实有效.
主要问题在于is_null($val):使用数组,我不能使用isset作为测试,因为数组的每个元素都是设置的.如果包含允许Null值的占位符的所有字段都具有Null广告默认值,则代码将起作用.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。