2016-02-24 4 views
-2

Я использую PDO в PHP. Мне удалось запустить первую вставку, но мне не удалось получить вторую. Я запускаю их одним нажатием кнопки. Вот мои основные два 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

укажите свой код php –

+0

1. Вы должны установить PDO в режиме исключения, чтобы увидеть фактическую ошибку. 2. Никакие кавычки никогда не должны использоваться вокруг заполнителей. Прочтите, как правильно использовать PDO [здесь] (https://phpdelusions.net/pdo) –

+1

Не помещайте кавычки вокруг '?' Заполнителей. Это не синтаксис для подготовленных операторов. SQL-движок знает, что делать с параметрами, основанными на их типах данных: не добавляйте кавычки! – trincot

ответ

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 и установить его свойства, чтобы отразить код ошибки и информация об ошибках. Этот параметр также полезен во время отладки, так как он эффективно «взорвет» сценарий в точке ошибки, очень быстро указывая пальцем на потенциальные проблемные области вашего кода (помните: транзакции автоматически откатываются, если исключение вызывает скрипт для завершения).

Режим исключения также полезен, поскольку вы можете структурировать обработку ошибок более четко, чем с традиционными предупреждениями в стиле PHP, и с меньшим количеством кода/вложенности, чем при работе в бесшумном режиме и явным образом проверяя возвращаемое значение каждого вызова базы данных.

См. Exceptions для получения дополнительной информации об исключениях в PHP.

Код для установки этой стратегии обработчика ошибок (сразу после инициализации соединения):

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

Убедитесь, что все исключения и предупреждения, как сообщается, установив error_reporting и display_errors директивы appropriately в php.ini.

+0

errorInfo() является ненадежным источником. Пожалуйста, узнайте [как правильно сообщать об ошибках PDO] (https://phpdelusions.net/pdo#errors) –

+0

@YourCommonSense, большое спасибо за это просветление! Я обновил свой ответ, надеюсь, не укажу в неправильном направлении относительно обработки ошибок. – trincot

Смежные вопросы