Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取包含sql查询的php变量,并使用$db->;将其添加到现有sql查询中;UpdatePhoneNumber()?_Php_Mysql_Sql_Arrays - Fatal编程技术网

如何获取包含sql查询的php变量,并使用$db->;将其添加到现有sql查询中;UpdatePhoneNumber()?

如何获取包含sql查询的php变量,并使用$db->;将其添加到现有sql查询中;UpdatePhoneNumber()?,php,mysql,sql,arrays,Php,Mysql,Sql,Arrays,我正在尝试建立一个用户数据库。一个用户可以拥有无限数量的电话号码。因此,在表单中,我创建了一个js函数,它将为我提供新的输入字段,并将信息放入嵌套数组中 我正在执行一个双foreach循环来遍历我的数组,并根据id是否已经存在并且只需要更新,或者它是否是全新的并且需要插入,向其中添加SQL查询。我将这些SQL查询添加到变量$phoneSql。当我回显该变量时,它确实包含一个有效的SQL查询,如果我直接在phpMyAdmin中尝试它,该查询就会工作 这是foreach循环代码: $phoneSq

我正在尝试建立一个用户数据库。一个用户可以拥有无限数量的电话号码。因此,在表单中,我创建了一个js函数,它将为我提供新的输入字段,并将信息放入嵌套数组中

我正在执行一个双foreach循环来遍历我的数组,并根据id是否已经存在并且只需要更新,或者它是否是全新的并且需要插入,向其中添加SQL查询。我将这些SQL查询添加到变量$phoneSql。当我回显该变量时,它确实包含一个有效的SQL查询,如果我直接在phpMyAdmin中尝试它,该查询就会工作

这是foreach循环代码:

 $phoneSql = 'SELECT id FROM user WHERE id = '.$id.' INTO @id;';
 foreach($_POST['phone'] as $key => $value) {
    foreach($_POST['user'][$key] as $id => $number) {
        if($id == 0 && !$number == ''){
            $phoneSql .= 'INSERT INTO phone_number (id, user_id, number) VALUES (NULL, @id, "'.$number.'");';
            } else if (!$number == '') {
                $phoneSql .= 'UPDATE phone_numbers SET user_id = @id,  number = "'.$number.'" WHERE id = '.$id.';';
            } 
        }
    }
我有一个带有表单的edit.php页面,它发布到update.php,其中我有上面的foreach循环和以下代码:

$db->updatePhoneNumber($phoneSql);
它还从我正在编辑的用户那里获取$id。然后它被发送到db.php并进入此函数:

public function updatePhoneNumbers($phoneSql) {
    $ phoneSql = $ phoneSql;

    $sth = $this->dbh->prepare($phoneSql);
    $sth->execute();
    if ($sth->execute()) {
        return true;
    } else {
        return false;
    }
}

但这是行不通的。我可以将带有sql查询的变量添加到这样的函数中吗?还是必须以其他方式添加?我对这个很陌生,所以我不知道该怎么做。我试图寻找解决方案,但没有找到任何解决方案。我很感谢你的建议。

你应该做的是使用一个构造,为你节省很多逻辑

e、 g


这样,无需选择、测试、然后插入/更新。您只需插入,如果出现重复密钥错误,MySQL将透明地将其转换为更新。

您应该做的是使用构造,为您节省大量的逻辑

e、 g


这样,无需选择、测试、然后插入/更新。你只要插入,如果出现重复的密钥错误,MySQL将透明地将其转换为更新。

$phoneSql=$phoneSql这一行什么也不做。将用户id和电话号码添加到关联数组中,构建sql查询并在单独的foreach循环中运行,难道不更容易吗?首先要了解您的操作。但是你问问题的方式让你很难真正找出你不明白的最重要的事情。从读一本关于SQL的书开始怎么样?您可能希望在更新页面中重新考虑您的策略。如果我有20个电话号码,并且更新了其中的1个,那么您的代码只能访问数据库1次。谢谢您的回复@Madara Uchiha,你说得对,$phoneSql=$phoneSql什么都不做,所以我删除了它。
$phoneSql=$phoneSql
这一行什么都不做。将用户id和电话号码添加到关联数组中,构建sql查询并在单独的foreach循环中运行,这不是更容易吗?首先要了解你在做什么。但是你问问题的方式让你很难真正找出你不明白的最重要的事情。从读一本关于SQL的书开始怎么样?您可能希望在更新页面中重新考虑您的策略。如果我有20个电话号码,并且更新了其中的1个,那么您的代码只能访问数据库1次。谢谢您的回复@Madara Uchiha,你说得对,$phoneSql=$phoneSql什么都不做,所以我删除了它。谢谢你的回答,Marc。我会考虑使用插入。。。在重复密钥更新时。这似乎是一个更简单的解决方案。谢谢你的回答,马克。我会考虑使用插入。。。在重复密钥更新时。这似乎是一个更容易的解决办法。
INSERT INTO phone_number (id, user_id, number) VALUES (...)
ON DUPLICATE KEY UPDATE user_id=VALUES(user_id), number=VALUES(number)