当前位置: 首页 > 面试题库 >

使用PDO插入/更新帮助器功能

祁承嗣
2023-03-14
问题内容

我有一个非常简单的辅助函数,可为传统的普通mysql驱动程序用法生成SET语句:

function dbSet($fields) {
  $set='';
  foreach ($fields as $field) {
    if (isset($_POST[$field])) {
      $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
    }
  }
  return substr($set, 0, -2); 
}

这样使用

$id = intval($_POST['id']);
$fields = explode(" ","name surname lastname address zip fax phone");
$_POST['date'] = $_POST['y']."-".$_POST['m']."-".$_POST['d'];
$query  = "UPDATE $table SET ".dbSet($fields)." stamp=NOW() WHERE id=$id";

它使代码非常干燥,同时又容易又灵活。

我要问是否有人愿意利用PDO准备好的语句功能来共享类似的功能?

我仍然对如何实现这一目标感到怀疑。
是否有使用PDO准备好的语句插入数据的简单明了的方法?它应该是什么形式?查询构建器助手?还是插入查询助手?应该采用什么参数?

我希望它可以很容易用作SO的答案。因为在每个主题中我们都可以看到准备好的语句用法建议,但是没有一个很好的例子。我的意思是现实生活中的例子。我认为,键入bind_param()20次不是一种好的编程风格。甚至还有20个问号。


问题答案:

我通常有一个扩展PDO的类,但是我的类非常定制。如果我将其清理和测试过,将在以后发布。但是,这是您系统的解决方案。

function dbSet($fields, &$values) {
    $set = '';
    $values = array();

    foreach ($fields as $field) {
        if (isset($_POST[$field])) {
            $set .= "`$field` = ?,";
            $values[] = $_POST[$field];
        }
    }

    return rtrim($set, ',');
}

$fields = explode(" ","name surname lastname address zip fax phone date");
$_POST['date'] = $_POST['y']."-".$_POST['m']."-"$_POST['d'];

$query  = "UPDATE $table SET ".dbSet($fields, $values).", stamp=NOW() WHERE id=?";
$values[] = $id;

$dbh->prepare($query);
$dbh->execute($values);

这可能并不完美,可能需要进行调整。它考虑了$dbh使用PDO连接进行设置的情况。待我提出的任何次要语法问题,都应该可以。

编辑

确实,我想我会选择教义ORM(或另一个ORM)。当您设置模型并在其中添加所有验证时,它非常简单:

$table = new Table();
$table->fromArray($_POST);
$table->save();

那应该容易地填充内容。当然,这对于ORM(如Doctrine)而言。

更新

对第一个代码做了一些小的调整,例如isset放回并使用rtrimover
substr。要提供一个PDO扩展类的模型的工作,就必须布局该方法并进行一些单元测试以确保它可以工作。



 类似资料:
  • 一:即时输入提示: 我们打开菜单“工具”→“系统配置”,选择“输入”子夹,通过下面2张图的对比,我们可以看到新版易语言将以前的“提供数据类型选择列表”这个选择项修改为“即时输入提示”(如图): 旧版本系统配置对话框 新版本系统配置对话框 通过这个选项,我们可以选择在输入代码的时候是否需要有提示框。 即时输入提示框会在以下几个地方出现: 1:输入代码的时候,(如图): 2:输入返回值类型的时候,(如

  • 问题内容: 有人可以告诉我如何解决此查询吗? 我只想通过匹配ID来大规模更新基于ID的挂牌价格。 问题答案: 请注意,此查询将使用其他ID将记录的价格更新为。 如果只想更新列表中的ID,请使用以下命令:

  • 问题内容: 我正在掌握PDO的基础知识。 但是我试图获取插入的行的ID,我使用: 我遇到的教程都是关于交易的,但是我没有使用交易! 问题答案: 您可能正在寻找lastInsertId。“返回最后插入的行或序列值的ID”。

  • 问题内容: 我在使用PDO将多个记录插入数据库时​​遇到麻烦。我可以成功添加一条记录,但是一旦添加循环,它就会失败。在阅读了与此相关的许多其他SO问题之后,我相信我需要“绑定”我的变量,尽管我对正确的语法完全感到困惑。 这是我创建的原始函数: 在类似于此: 更新: 对于那些感兴趣的,这是我修复错误后的最终功能: 问题答案: 您不需要绑定变量。香港专业教育学院以前用类似的代码做到这一点。很难说出什么

  • 问题内容: 由于MySQL忽略了检查约束,如何使用触发器来阻止插入或更新的发生? 例如: 表foo有一个称为agency的属性,并且agency属性只能是1、2、3、4或5。 还是有更好的方法来进行MySQL中的检查约束? 问题答案: 尝试SIGNAL语法-https: //dev.mysql.com/doc/refman/5.5/en/signal.html 编辑 根据Bill Karwin下面

  • 我正在上Java课程的第三周。我正在做一个下星期要交的课堂作业。使用控制台作为输出,我可以毫无问题地完成分配,这是可以接受的。然而,教授也建议我们研究JTextArea,并考虑将其用于我们的程序输出。 我从一个教程中找到了一些代码,并且能够至少得到一个文本块来显示我要显示的第一行文本。但是在我编写实际程序时,我需要随着程序的进展继续向文本块添加额外的行。