Php 根据需要裁剪阵列

Php 根据需要裁剪阵列,php,arrays,foreach,Php,Arrays,Foreach,我想将数组值写入数据库,如下所示: “更新tbl集合$fieldname=$fieldvalue,其中id=$recid” 我从$\u POST['changed']中得到这个数组: [changed] => Array ( [0] => Array ( [recid] => 1 [vorname] => Walter

我想将数组值写入数据库,如下所示:

“更新tbl集合$fieldname=$fieldvalue,其中id=$recid”

我从
$\u POST['changed']
中得到这个数组:

[changed] => Array
        (
            [0] => Array
                (
                    [recid] => 1
                    [vorname] => Walter
                    [nachname] => Bauer
                )

            [1] => Array
                (
                    [recid] => 2
                    [vorname] => Michael
                )

            [2] => Array
                (
                    [recid] => 3
                    [vorname] => Peter
                    [nachname] => Highler
                    [email] => p.highler@aol.com
                )

            [3] => Array
                (
                    [recid] => 4
                    [vorname] => Maria
                    [nachname] => Maier
                )

            [4] => Array
                (
                    [recid] => 5
                    [vorname] => Werner
                    [nachname] => Rock
                )

        )
当我使用这个
foreach
循环时,
recid
get也作为字段名-但这不应该发生

foreach ($_POST['changed'] as $SubArray)
{
    foreach ($SubArray as $key => $value)
    {
        $sql .= "UPDATE kunden SET ".$key."='".$value."' WHERE id=**?????????**";
    }       
}
试试这个:

foreach ($_POST['changed'] as $SubArray) {
    foreach ($SubArray as $key => $value) {
        if ($key === 'recid') continue;

        $sql = "UPDATE kunden SET $key = $value WHERE id = '$SubArray[recid]'";
    }    
}
此代码不适用于生产。必须转义每个
$\u POST
变量或使用PDO占位符。

更新(PDO占位符示例):

只需使用:

if ($key === 'recid') continue;
$sql .= "UPDATE kunden SET ".$key."='".$value."' WHERE id='".$SubArray['recid']."'";
而不是

$sql .= "UPDATE kunden SET ".$key."='".$value."' WHERE id=**?????????**";

您的SQL查询可用于SQL注入。看@Joren我知道但现在,我明白了,并且我理解并从我的问题中学到了我使用了这个字符串。您也使用
$sql.=
将结果分组为一个字符串,如果您使用的是旧的和不推荐的
mysql.*
库,它将不起作用,因为它每次只执行一个查询。@我有
$sql.=
将其写入一个字符串txt文件首先检查数组和foreach循环是否正常工作。另外,如果所有3个字段都存在,您将生成3个查询,您可以通过一个简单的检查来更新所有字段,仅附加当前字段。谢谢您的解决方案这是我问题的答案。还可以向用户写入PDO占位符。但不可能对表列使用占位符。例如,我不知道列名。是否也可以创建动态安全的PDO语句/占位符解决方案?很抱歉,我发现了错误-我有以下错误:
$sql=“UPDATE kunden SET$key=”:value“WHERE id=:recid”在删除
'
'
之前和之后:value'它现在对我起作用了。这是否也意味着,
:value
是字符还是整数无关紧要?我尝试了,添加了一个新列“age”,并将其设置为“int(11)”。我将$sql打印到一个txt文件中,只得到
UPDATE kunden SET age=:value,其中id=:recid
-缺少
:value
:recid
的值,并且数据库中的字段没有更新。$sql不是真正执行的查询。您可以在mysql服务器中启用查询日志,以检查执行的确切内容,或者在mysql客户端键入
show full processlist
中进行检查。或者在这里检查:这是不可能的,因为我从phpmyadmin
#1227-访问被拒绝;您需要此操作的超级权限
,而我在服务器上没有root权限。是否有其他解决方案-可能将执行的查询也打印到txt文件中?
$sql .= "UPDATE kunden SET ".$key."='".$value."' WHERE id=**?????????**";
foreach ($_POST['changed'] as $SubArray)
{
    $id = $subArray['recid'];
    $values = array();

    foreach ($SubArray as $key => $value)
    {
        if($key != 'recid')
        {
            $values[] = $key . '=' . $value;                
        }
        $sqlValues = implode(', ', $values);
    }

    $sql = "UPDATE kunden SET " . $sqlValues . " WHERE id='" . $id . "'";
    //execute query here
}