编辑,我将代码更改为建议答案,所有代码段现已更新
目前,我正在玩PHP。因此,我试图建立一个可以执行SQL命令的程序。因此,我正在尝试编写一些将执行查询的函数。但是我到了无法忍受自己的地步。我的麻烦是,对于INSERT INTO命令,我想给出一个数组,其中包含要插入的数据,但我根本不知道如何执行此操作。
这是我得到的,并且我认为与此手术有关的
首先,我想要创建的功能
public function actionInsert($data_values = array())
{
$db = $this->openDB();
if ($db) {
$fields = '';
$fields_value = '';
foreach ($data_values as $columnName => $columnValue) {
if ($fields != '') {
$fields .= ',';
$fields_value .= ',';
}
$fields .= $columnName;
$fields_value .= $columnValue;
}
$sqlInsert = 'INSERT INTO ' . $this->tabelle . ' (' . $fields . ') VALUES (' . $fields_value . ')';
$result = $db->query($sqlInsert);
echo $sqlInsert;
if ($result) {
echo "success";
} else {
echo "failed";
}
}
}
这就是我过滤值的方式
<?php
require_once 'funktionen.php';
$adresse = new \DB\Adressen();
$adresse->actionInsert(array('nachname'=>'hallo', 'vorname'=>'du'));
我的结果
向地址中插入adressen(别名,vorname)值(hallo,du)失败
我希望看到的东西
成功
当然还有数据库中新插入的值
答案 0 :(得分:0)
这是在课堂内吗?我认为tabelle属性设置正确。 也就是说,您应该更正foreach循环,该循环使用不正确:
public function actionInsert($data_values) //$data_values should be an array
{
$db = $this->openDB();
if ($db) {
foreach ($data_values as $data){
// $data_values could be a bidimensional array, like
// [
// [field1=> value1, field2 => value2, field3 => value3],
// [field1=> value4, field2 => value5, field3 => value6],
// [field1=> value7, field2 => value8, field3 => value9],
// ]
$fields = Array();
$values = Array();
foreach($data as $key => $value){
array_push($fields,$key);
array_push($values,"'$value'");
}
$sqlInsert = 'INSERT INTO ' . $this->tabelle . ' (' . join(',',$fields) . ') VALUES (' . join(',',$values) . ')';
$result = $db->query($sqlInsert);
echo $sqlInsert;
if ($result) {
echo "success";
} else {
echo "failed";
}
}
}
这是一种相当基本的方法,其中您可以循环浏览数据并针对每一行进行查询,但是如果您拥有大型数据集,则效果不佳。 另一种方法是通过将查询装入循环并稍后发送(请注意起始数组是不同的)来一次完成所有操作:
public function actionInsert($data_values) //$data_values should be an array
{
$db = $this->openDB();
if ($db) {
$vals = Array();
foreach ($data_values['values'] as $data){
// $data_values could be an associative array, like
// [
// fields => ['field1','field2','field3'],
// values => [
// [value1,value2,value3],
// [value4,value5,value6],
// [value7,value8,value9]
// ]
// ]
array_push('('.join(',',"'$data'").')',$vals);
}
$sqlInsert = 'INSERT INTO ' . $this->tabelle . ' (' . join(',',$data_values['fields']) . ') VALUES '.join(' , ',$vals);
$result = $db->query($sqlInsert);
echo $sqlInsert;
if ($result) {
echo "success";
} else {
echo "failed";
}
}
通过Dragonthought的正确方法,即使您不公开,也应该对某种良好习惯的做法进行消毒。
答案 1 :(得分:0)
在不使用PDO
的情况下使用关系数据库时,需要考虑以下几点:
您正在使用的数据库是什么。
由您决定从MySQL
,postgreSQL
,SQLite
等中进行选择,但是不同的DB通常具有用于插入和选择数据以及其他操作的不同语法。另外,您可能需要不同的类和函数才能与它们进行交互。
话虽如此,您是否签出了PHP的官方手册?例如,An overview of a PHP application that needs to interact with a MySQL database。
您要实现的目标是什么?
在弄乱实际代码之前先构造SQL是很有帮助的。检查您的SQL语法是否正确。如果您可以在数据库中运行SQL,则可以尝试接下来实现代码。
在您的代码中形成SQL查询的正确方法是什么?
可以在本地开发环境中随意摆弄,但是您绝对应该学习如何使用准备好的语句来防止可能的SQL注入攻击。
还了解有关PHP中数组的更多信息:Arrays in PHP。您可以在foreach
循环中使用键值对:
foreach ($keyed_array as $key => $value) {
//use your key and value here
}
您不需要在循环本身中构造查询。您仅使用循环来构造查询字段字符串和VALUES
字符串。构造VALUES
列表时请格外小心,因为您的字段可以具有不同的类型,并且应该在字符串字段值周围添加双引号。是的,当您“手动”执行操作时,您将遇到所有这些麻烦。如果您使用查询参数或PDO
或任何其他高级驱动程序,则可能会容易得多。
之后,您只需将值连接起来即可构成SQL
查询。
一旦您更加熟悉语言本身和正在使用的数据库,您肯定会感到更加自在。祝你好运!
答案 2 :(得分:0)
由于@Eagle L的回答,我找到了一种最终可行的方法。这与我最初尝试的方法有所不同,但是如果有人遇到类似的麻烦,我希望这可以帮助他。
//get the Values you need to insert as required parameters
public function actionInsert($nachname, $vorname, $plz, $wohnort, $strasse)
{
//database connection
$db = $this->openDB();
if ($db) {
//use a prepared statement
$insert = $db->prepare("INSERT INTO adressen (nachname, vorname, plz, wohnort, strasse) VALUES(?,?,?,?,?)");
//fill the Values
$insert->bind_param('ssiss', $nachname, $vorname, $plz, $wohnort, $strasse);
//but only if every Value is defined to avoid NULL fields in the Database
if ($vorname && $nachname && $plz && $wohnort && $strasse) {
已编辑
$inserted = $insert->execute(); //added $inserted
//this is still clumsy and user unfriendly but serves my needs
if ($inserted) {//changed $insert->execute() to $inserted
echo 'success';
} else {
echo 'failed' . $inserted->error;
}
}
}
}
和函数调用
<?php
require_once 'funktionen.php';
$adresse = new \DB\Adressen();
$adresse->actionInsert('valueWillBe$nachname', 'valueWillBe$vorname', 'valueWillBe$plz', 'valueWillBe$wohnort', '$valueWillBe$strasse');