php - sql - 仅更新表单中更改的值到多个表

标签 php mysql pdo

此问题与 this question here 相关

假设我已从多个表中提取值到表单中,并且想要更改一个或多个输入,即。电话号码或地址。

这是我的选择查询:

SELECT c.*, u.username
FROM   client c
JOIN   users u ON u.id = c.credid
WHERE  credid = :id

考虑到上面链接的问题(和答案),我如何为已更改的值进行准备好的更新查询? 我的表是InnoDB。

编辑:我需要将用户名放入用户表中,将其他所有内容放入客户端表中。 (clients表字段credid是users表主键id的外键)

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
<?php
echo 'Username: <input type="text" name="1" value="' . $getuserinfo['username'] . '" /><br>';
echo 'Client: <input type="text" name="2" value="' . $getuserinfo['company'] . '" /><br>';
echo 'Address: <input type="text" name="3" value="' . $getuserinfo['address1'] . '" /><br>';
echo 'Address 2: <input type="text" name="4" value="' . $getuserinfo['address2'] . '" /><br>';
echo 'ZIP: <input type="text" name="5" value="' . $getuserinfo['zip'] . '" /><br>';
echo 'City: <input type="text" name="6" value="' . $getuserinfo['city'] . '" /><br>';
echo 'Country: <input type="text" name="7" value="' . $getuserinfo['country'] . '" /><br>';
echo 'E-mail: <input type="text" name="8" value="' . $getuserinfo['email'] . '" /><br>';
echo 'Phone number: <input type="text" name="9" value="' . $getuserinfo['phone'] . '" /><br>';
?>

    <input type="submit" name="submit" value="Save " /><br>
</form>

编辑: 我想构建类似于这样的sql。

UPDATE c.(name, address, zip, email, phone, etc.),u.username 
VALUES (:1, :2, :3, :etc) 
FROM client c 
JOIN users u ON u.id = c.credid 
WHERE credid = :id

这附近有吗? 或者也许是这样的:

UPDATE users,client
SET users.username = :username,
    client.value1 = :value1,
    client.value2 = :value2,
    etc...

 WHERE client.credid=users.id

最佳答案

您需要首先将输入重命名为表列的名称,例如

foreach ($getuserinfo as $key => $val) {

    echo ucfist($key).': <input type="text" name="'.$key.'" value="' . $val . '" /><br>';
}

上面不会给您确切的标签,但添加 if 语句来更改它很容易。

最初获取信息后,将其添加到 session 数组中以检查是否有任何更改

$_SESSION = $getuserinfo;

然后在表单回发后(请记住,除了检查索引是否已存在于 $_SESSION 中之外,这不包含任何验证)

if ($_POST['username'] != $_SESSION['user_edit_info']['username']) {

    //run validation and query to update username
}

$posted = $_POST;
unset($posted['username']);

$sql_array = array();

$params = array();

foreach ($posted as $key => $val) {

    //This should prevent extra fields being posted
    if (isset($_SESSION['user_edit_info'][$key]) && $_SESSION['user_edit_info'][$key] != $val) {

        $sql_array[] = "$key=:$key";
        $params[$key] = $val;
    }
}

if (!empty($sql_array)) {

    $params['id'] = $_SESSION['user_id']; //or whatever you set it to in your session

     //I don't know exactly how you're running your PDOs but below should at least show
     //what you need to do
    ('UPDATE client SET '.implode(',', $sql_array).' WHERE credid=:id', $params);
}

//finally you don't need this anymore so just unset it
unset($_SESSION['user_edit_info']);

希望这有帮助!

关于php - sql - 仅更新表单中更改的值到多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25764330/

相关文章:

php - PHP 示例代码从 mysqli 到 PDO 的翻译

php - 在不知道字段 php 的情况下循环遍历 fetchall

php - 使用 PHP 的动态网站

mysql - Insert into.....values((select 语句), value1, value2, value3) Select 语句返回多列

mysql - 如何将 "limit"中的字符串参数转换为 int

php - CakePhp - 如何访问 find->innerJoinWith 中的变量?

php - While循环不显示任何内容

PHP AJAX HTML : changing unique table data in foreach loop

php - 在关联数组中查找最大值

phpunit 测试套件的独立性