$ SQL =插入和更新

时间:2016-02-24 09:34:42

标签: php mysql pdo

我在PHP中使用PDO。我已经设法让第一个Insert运行但我无法获得第二个。我按下按钮运行它们。这是我的两个基本SQL查询。

INSERT INTO MockTable ( 
     `A`, `B`, `C`, `D` ) 
SELECT `A`, `B`, `C`, `D`
FROM SecondaryTable
ORDER BY A ASC;

UPDATE MockTable
SET
    `Name` = From Form,
    `Date` = Actual Date
WHERE
    `Name` = ''
AND `Date` = '0000-00-00';

我正在使用

.$_POST["Name"].
.date("Y-m-d").

名称和日期

PHP代码(真的很乱,因为我试图解决它):

<?php
if(isset($_POST["submit"])){

try {
require '/home4/kylex63/MockUpConfig.php';

$sql = "
INSERT INTO MockTable (`A`, `B`, `C`, `D`) 
SELECT `A`, `B`, `C`, `D` 
FROM SecondaryTable 
ORDER BY A ASC;


UPDATE `MockTable` 
SET `Name` = ".$_POST["Name"].", `Date` = ".date("Y-m-d")." 
WHERE `Name` = \'\' 
AND `Date` = \"0000-00-00\";
";

if ($db->query($sql)) {
echo "<script type= 'text/javascript'>alert('New Record Inserted     Successfully');</script>";
}

1 个答案:

答案 0 :(得分:1)

您应该使用预准备语句来避免SQL注入,然后使用没有引号的?占位符。我也会一次执行一条语句,因此如果第一个或第二个语句失败,您可以控制需要发生的事情:

$db->query("
    INSERT INTO MockTable (`A`, `B`, `C`, `D`) 
    SELECT `A`, `B`, `C`, `D` 
    FROM SecondaryTable 
    ORDER BY A ASC");

$stmt = $db->prepare("
    UPDATE MockTable 
    SET `Name` = ?, `Date` = ? 
    WHERE `Name` = '' 
    AND `Date` = '0000-00-00'");

$stmt->execute(array($_POST["Name"], date("Y-m-d")));

echo "<script type= 'text/javascript'>
    alert('New Record Inserted Successfully');
</script>";

这应该使UPDATE按预期工作。

您最好将错误处理策略设置为PDO::ERRMODE_EXCEPTION

  

PDO::ERRMODE_EXCEPTION

     

除了设置错误代码之外,PDO还会抛出PDOException并设置其属性以反映错误代码和错误信息。此设置在调试过程中也很有用,因为它会有效地“爆炸”#34;在错误点处的脚本,非常快速地指出代码中潜在的问题区域(记住:如果异常导致脚本终止,事务会自动回滚)。

     

异常模式也很有用,因为您可以比使用传统的PHP样式警告更清楚地构建错误处理,并且使用较少的代码/嵌套,而不是在静默模式下运行并显式检查每个数据库调用的返回值。

     

有关PHP中的异常的更多信息,请参阅Exceptions

设置此错误处理程序策略的代码(在初始化连接后立即执行):

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

通过在php.ini中设置error_reportingdisplay_errors指令appropriately,确保报告所有例外和警告。