【问题标题】:Can I do PDO prepare statements with array and foreach loop我可以用数组和 foreach 循环做 PDO 准备语句吗
【发布时间】:2024-09-04 00:10:03
【问题描述】:

所以我合法地开始阅读有关 PDO 和 PDO 状态的信息,以更新我的代码并为其提供更高的安全性,但我真的不知道这是否可行或是否可以进行注入。我还在制作数组之前对数据进行了清理。我做了这个函数o添加数据给定名称表和一个具有列名称和值的数组,如下所示

$tabla = 'tabla'
$datos = array(
        'id' => 'NULL',
        'id_usuario' => "'{$usuario['id']}'",
        'id_tipo' => "'{$tipo}'",
        'id_estado' => "'{$estado}'",
        'id_visibilidad' => "'{$visibilidad}'",
        'titulo' => "'{$titulo}'",
        'contenido' => "'{$contenido}'",
        'fecha' => 'CURRENT_TIMESTAMP'
      );

function pdo_agregar($tabla, $datos) {
  global $pdo;
  $columnas = implode(', ', array_keys($datos));
  $valores = implode(', ', array_values($datos));
  $sentencia = $pdo->prepare("INSERT INTO $tabla ($columnas) VALUES ($valores)");
  foreach($datos as $indice => $valor) {
    $sentencia->bindParam(':'.$indice, $valor);
  }
  if($sentencia->execute()) {
    return true;
  } else {
    return false;
  }
  $sentencia->close();
  $pdo->close();
}

这样好吗? o 我必须做出类似的陈述吗

$sentencia = $pdo->prepare("INSERT INTO $tabla (col, col2, col3) 值 (:col, :col2, :col3");

然后单独绑定参数?

提前致谢!

【问题讨论】:

    标签: php mysql security pdo prepared-statement


    【解决方案1】:

    你不需要这些绑定的东西,你可以直接抛出一个数组给 PDO 的执行函数(它为你做这个绑定)。

    我的数组如下["data" => "mydata", "data2" = "mysecond"],所以我会生成如下查询:

    INSERT INTO `Tab`(`data`, `data2`) VALUES (:data, :data2)
    

    代码是:

            foreach($data as $key=>$val){
                $keys[] = $key;
                $vals[] = ":".$key;
            }
            $keys = "`".implode("`,`", $keys)."`";
            $vals = implode(",", $vals);
            $sql = "INSERT INTO `".$tab."`(".$keys.") VALUES (".$vals.")";
            $prep_insert = $this->pdo->prepare($sql);
            $prep_insert->execute($data);
    

    顺便说一句,你应该使用 classes 和 this,而不是 this 全局的东西。

    【讨论】:

    • 谢谢!另外,为什么使用类而不是这个更好?
    • 它更好地阅读,你仍然在类中使用函数,但它更有条理,你在创建类时执行一次 pdo 连接,你可以从每个函数中使用它,这是我的一个 pdo 类,也许你明白我的意思github.com/rautex/ccrm/blob/master/PDO_Class.php
    • 非常感谢@StefanBD!我很欣赏它
    • np,顺便说一句,你应该把 $tabla 放在``中,我们的上一个编码器遇到了麻烦,但没有这样做,例如,我们想添加字段 alter(german for age),但这是一个mysql的保留字,所以我们很困惑为什么没有保存数据
    • @mw509 该评论是因为我已经编辑了使用“缩写”语言编写的问题,但它使非英语人士难以理解,并且帮助正确编写也令人鼓舞.另外,这是一个新用户的问题,所以最好现在教他们。