2016-07-24 4 views
1

Я пытаюсь сделать UPDATE и SELECT в том же sql-заявлении. По какой-то причине приведенный ниже код не работает.Обновление и выбор MySQL в одном заявлении

$sql = "UPDATE mytable SET last_activity=CURRENT_TIMESTAMP, 
info1=:info1, info2=:info2 WHERE id = {$id};"; 

$sql .= "SELECT id, info1, info2 FROM myTable 
WHERE info1 >=:valueA AND info2>:valueB;" 

$stmt = $conn->prepare($sql); 
$stmt->bindParam(":info1", $info1); 
$stmt->bindParam(":info2", $info2); 

$stmt->bindParam(":valueA", $valueA); 
$stmt->bindParam(":valueB", $valueB); 

$stmt->execute(); 

$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

echo json_encode($result); 

ВОПРОС:, что я мог бы делать неправильно? Я тратил часы на этот вопрос, зная, что это, вероятно, небольшая ошибка прямо под моим носом.


Отредактировано:

Я получил сообщение об ошибке при загрузке страницы, которая содержит код PHP:

неперехваченное исключение 'PDOException' с сообщением «SQLSTATE [HY000]: Общая ошибка 'в ajaxCall.php: 89 Трассировка стека: # 0 ajaxCall.php (89): PDOStatement-> fetchAll (2) # 1 {main} брошен в ajaxCall.php в строке 89

Я использую ajax для вызова php-страницы, содержащей указанный выше код, и когда я загружаю php-страницу из браузера, я получаю вышеуказанное сообщение об ошибке.

Line 89: $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

+0

Вы получаете сообщение об ошибке? Почему бы не связать '$ id'? – chris85

+0

@ chris85 $ id получается из $ _SESSION, никогда не получаемого от пользователя.Я сейчас проверю ошибку. и $ valueA была написана с ошибкой здесь, это было хорошо в коде – Webeng

+0

вы начали сеанс? это в свете нового кода в комментариях. Вы также отметили как ajax, почему? любая релевантность? –

ответ

2

Поскольку вы используете два запроса, вам нужно позвонить nextRowset, чтобы получить доступ к результатам со второго.

Таким образом, сделать это следующим образом:

// code 
$stmt->execute(); 
$stmt->nextRowset(); 
// code 

При запуске двух или более запросов, вы получите мульти-набора строк результат. Это означает, что вы получите что-то вроде этого (только представления, не действительно это):

Array(
    [0] => rowset1, 
    [1] => rowset2, 
    ... 
) 

Так как вы хотите, чтобы второй набор -The результатом SELECT - вы можете потреблять первый один по телефону nextRowset. Таким образом, вы сможете получить результаты из «важного» набора.
(Даже если «употребление» может быть неправильным для этого, оно подходит для понимания)

0

Выполнение двух запросов с одного вызова разрешается только при использовании mysqlnd. Даже тогда вы должны иметь PDO::ATTR_EMULATE_PREPARES, установленный на 1 при использовании подготовленных операторов. Вы можете установить это с помощью:

$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1); 

В качестве альтернативы, вы можете использовать $conn->exec($sql), который работает независимо. Однако он не позволит вам привязывать любые данные к исполняемому SQL.

В целом, не выполняйте несколько запросов одним вызовом.

+0

мой текущий код в setAttribute - это '$ conn-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION); ', как я могу включить вашу предыдущую информацию вместе с предыдущими атрибутами одновременно? Будет ли это работать? : '$ conn-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION, PDO :: ATTR_EMULATE_PREPARES);'? и '1', я не уверен, что это должно быть как второй параметр или? – Webeng

+0

Я пробовал следующее: '$ conn-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION, PDO :: ATTR_EMULATE_PREPARES, 1);' без успеха – Webeng

+0

, и я попробовал '$ conn-> setAttribute (PDO :: ATTR_EMULATE_PREPARES , 1): «Совпадает ли сообщение об ошибке с этой проблемой? У моего обновленного вопроса есть сообщение об ошибке, которое я получаю. – Webeng

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