2016-07-19 6 views
1

Я пытаюсь обновить внутреннюю базу данных на почте сторонней платформе. Я успешно обновил одну и ту же базу данных для другой переменной, но когда я добавляю эту переменную во все ее разрывы. Вот MySQLi оператор обновления:mysqli update query failing

@$mysqli->query("UPDATE `tableName` SET `columnID`=" . (int)$columnID . ',`columnID2`=' . (int)$columnID2 . ',`columnID3`=' . (int)$columnID3 . ',`columnID4`=' . $columnID4 . ' WHERE `id`=' . (int)$id . ' LIMIT 1'); 

по какой-то причине он будет работать, если я вынимаю columnID4, но когда я columnID4 включен в заявлении не работает.

Я сделал дамп var на $ columnID4, и он возвращает значение, которое я ожидаю каждый раз.

, когда я сделал

echo $mysqli->error; 

Я получил сообщение о том, "Array" неизвестный массив в 'наборе поле'.

Вот как выглядит мой код, где я устанавливаю поле.

if ($query->num_rows == 1) { 
    $columnID4 = $query->fetch_assoc(); 
} else { 
    $columnID4 = 0; 
} 
+0

Вы хотите иметь '(int)' перед столбцомID4? –

+0

соответствует ли тип данных базы данных тем, что вы отправляете через php? –

+0

yes, columnID4 устанавливается в db как десятичное, а не int. Я проверю тип отправки php. – kemosabe

ответ

0

Всегда сложно отлаживать SQL, глядя на PHP-код, который строит строку SQL. Вместо этого посмотрите на SQL после он был построен!

Совет: никогда не используйте оператор подавления ошибок @. Лучше исправить ошибки, а не подавлять их.

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

Решение 1: Используйте sprintf() для интерполяции переменных в строку SQL. Это позволяет вам принуждать переменные к целым числам или десятичным знакам, используя %d и %f соответственно.

$sql = sprintf("UPDATE `tableName` SET `columnID`=%d, `columnID2`=%d, 
    `columnID3`=%d, `columnID4`=%f WHERE `id`=%d LIMIT 1", 
    $columnID, $columnID2, $columnID3, $columnID4, $id); 
error_log("sql = $sql"); 
$mysqli->query($sql); 

Решение 2: Использовать связанные параметры с помощью mysqli_stmt::bind_param(). Это рекомендуется при использовании SQL. Переменные никогда не касаются вашего кода SQL, нет возможности разбить синтаксис запроса.

$sql = "UPDATE `tableName` SET `columnID`=?, `columnID2`=?, 
    `columnID3`=?, `columnID4`=? WHERE `id`=? LIMIT 1"; 
error_log("sql = $sql"); 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param("iiidi", $columnID, $columnID2, $columnID3, $columnID4, $id); 
$stmt->execute(); 
0

Решение моей проблемы изменял, если заявление на следующее:

if ($query->num_rows == 1) { 
    $array = $query->fetch_assoc(); 
    $columnID4 = $array['num']; 
} else { 
    $columnID4 = 0; 
} 

Проблема, что я получаю объект массива обратно и код не знал, что с ним делать и не смог найти конкретную информацию в этом массиве, о котором я просил.