【问题标题】:Php function to run mysql queries运行mysql查询的php函数
【发布时间】:2013-12-30 10:47:51
【问题描述】:

我正在尝试创建函数来运行 mysql 查询

我将如何做诸如插入查询之类的事情。我在想

function insert_query ($table,$cols,$values)
{
$sql="insert into $table ($cols) values ($values) "; ...etc
}

与函数中的其余查询代码。但是如何添加多个列和值?

我应该在函数内部创建 $cols$values 数组吗?

【问题讨论】:

  • 使用 mysqli_* 或 pdo 语句..
  • ^是的!使用 PDO - 准备好的语句!因此,您可以随时执行查询!
  • 我开始学习 mysqli ,所以我将在我的函数中使用它
  • pdo 这有点不友好,这就是我使用 mysqli 的原因
  • @HellBaby 有了 PHP 的文档和一些 Google 搜索,它变得非常简单! :)

标签: php mysql sql


【解决方案1】:

这是我的数据库类的一个函数。

public function insert($table,$values){               
                $fieldNames = "";
                $fieldValues = "";

                foreach($values as $key => $value){
                    $fieldNames .= "$key,";
                    $fieldValues .= "$value,";
                }
                $fieldNames = substr($fieldNames,0,-1);
                $fieldValues = substr($fieldValues,0,-1);
                $sql = "INSERT INTO $table($fieldNames) VALUES ($fieldValues)";

                $this->newConnection();
                $result = $this->mysqli->query($sql);
                $this->closeConnection();
                return $result;
  }

【讨论】:

  • 我想知道您为什么选择foreachsubstr()。为什么不是简单的内爆?原生数组函数比“手动”循环更快
  • 您没有转义 $value,这会导致 SQL 注入攻击。您也没有在 SQL 中引用 $value,因此这不适用于字符串值。
  • 抱歉,我对原生数组函数不太熟悉,所以我使用了foreachsubstring
  • @steveayre 我很难弄清楚如何引用这些值。你能改进那个代码吗?谢谢。
【解决方案2】:

这是我正在使用的。将字段名称和值作为数组键和值传递。 $lsQry 是一个字段名和值对的数组

function insert_record($table,$lsQry)
{
    $fields_str = implode(',',array_keys($lsQry));
    $data_str = implode("','",$lsQry);        
    $data_str = "'" . implode("','", $lsQry) . "'";         

    $lsQry = "INSERT INTO $table($fields_str) VALUES($data_str)";
    $rs = mysql_query($lsQry);

    if(isset($rs))
        return true;
    else
        return false;        
}

请注意

对于此函数,请考虑该函数正在获取字段名称和值对的数组。假设在从 post/get 值创建数组时已经应用了 htmlentities() 和 addlashes() 或任何转义函数。

【讨论】:

  • 嗯,这一切都取决于开发人员希望如何使用。这个代码块只是给出了一个想法和一个解决方案。并不声称全部标准化。
  • 这不会转义值,从而导致 SQL 注入攻击。
【解决方案3】:

简单,只有我们的数组

function insert_query ($table,$cols,$values){
    $sql="insert into $table (".implode(",", $cols).") values (".implode("','", $values)."'') ";
}

insert_query('exampleTable', array('column_1', 'column_2', 'column_3'), array('a', 123, 'c') );

值的内爆需要一个小注解:
字符串总是需要用引号括起来。因此,我用单个 qoutes 进行了内爆。这样做的缺点是整数(如示例中的123)也会被包装。
这不是一个大问题,但如果您愿意,您可以将 implode 替换为使用 is_numeric 的 foreach 来检查它是否应该用引号括起来。

重要安全提示:
在此示例中,我没有使用适当的安全性,例如escape_string(),必须添加!我没有添加这些以使示例更小


另一种方法可能是数组的键/值使用:

function insert_query ($table,$data){
    $cols = array_keys($data);
    $values = array_values($data);
    $sql = "insert into $table (".implode(",", $cols).") values (".implode("','", $values)."'') ";
}
$info = array('column_1'=>'a', 'column_2'=>123, 'column_3'=>'c');
$info['example'] = 'Easy method to add more key/values';
insert_query('tableName', $info);

【讨论】:

  • 您没有转义这些值。这使得这段代码容易受到 SQL 注入攻击。
  • 我知道,我这样做是为了让它更简单。可以添加一个 array_map 并检查它是否是字符串-> 添加引号,然后反-sqlinject 它。我添加了一条注释以使其更清晰
【解决方案4】:

在这种情况下,您可以使用类似于 codeigniter 函数的函数。 使用数组存储表名和列或值

例如:

$data = array('hid' => $hcsdate,'start_date' => $sdate, 'end_date' => $edate, 'title' =>$title);

这里$data保存了列名和对应的值。

并将这个$data 传递给另一个函数以进行插入、更新等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 2016-01-03
    • 2012-01-04
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多