php mysql 预语句,PHP MySQL – 如何在预准备语句中插入默认值

假设我有一个准备好的声明,如下所示:

$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 (,,NOW(),,NOW(),,NOW(),,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( '', 'DEFAULT', $query );

}

else

{

$query = str_replace( '', '?', $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广告默认值,则代码将起作用.

标签:php,mysql,prepared-statement,insert

来源: https://codeday.me/bug/20190824/1705992.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值