PHP запрос на обновление в MySQL не обновляется, но SELECT и INSERT работают - PullRequest
1 голос
/ 03 марта 2020

Если я пытаюсь обновить запись в моей базе данных, она не работает, как и не обновлять. Но когда я пытаюсь выбрать значение из той же базы данных, это прекрасно работает. Я не уверен, почему это так.

Запрос на обновление:

$id = 1;

try {
    $conn = db();
    $sql = "UPDATE instagram SET token=?, expires=? WHERE id=$id";
    $stmt = mysqli_stmt_init($conn);

    if (!mysqli_stmt_prepare($stmt, $sql)) {
        throw new Exception($conn->error);
    }

    mysqli_stmt_bind_param($stmt, "si", $tokenAccess, $tokenExpires);
    mysqli_stmt_execute($stmt);

    // on error
    if (!mysqli_stmt_execute($stmt)) {
        throw new Exception($conn->error);
    }

    var_dump($stmt);

    $stmt->close();
    $conn->close();
}
catch (Exception $e) {
    print_r($e);
}

var_dump для $stmt возвращает:

object(mysqli_stmt)#4 (10) { 
        ["affected_rows"]=> int(1) 
        ["insert_id"]=> int(0) 
        ["num_rows"]=> int(0)
        ["param_count"]=> int(2) 
        ["field_count"]=> int(0) 
        ["errno"]=> int(0) 
        ["error"]=> string(0) "" 
        ["error_list"]=> array(0) { } 
        ["sqlstate"]=> string(5) "00000" 
        ["id"]=> int(1) 
}

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

ОБНОВЛЕНИЕ:

Моя таблица настроена следующим образом: table setup

Имеется одна запись, где:

  • token = ABCdefg123ad c ........ <- пример строки, содержит цифры и буквы </li>
  • expires = 60
  • create_at = 2019-12-01 08:57:26
  • id = 1.

Я пытался получить доступ к таблице через:

$sql = "INSERT INTO instagram (token, expires) VALUES (?, ?)";

Это, как и SELECT, работает.

Я также обнаружил, что if (!mysqli_stmt_execute($stmt)) отправлял запись дважды, поэтому я убрал ее. Тем не менее, обновление записи не работает.

Я также повторил значения для $tokenAccess и $tokenExpires. Результат содержит 60 для $tokenExpires и маркер долгосрочного доступа для $tokenAccess, как и ожидалось.

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

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

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Я вижу, что вы добавляете много ненужного кода. Вам не нужны все эти if операторы, и вам не нужно создавать исключения вручную. PHP может сделать это за вас.

Вам не нужно закрывать выписку и не нужно закрывать соединение. Никогда не перехватывайте исключения только для того, чтобы распечатать сообщение об ошибке!

Использование OOP также сделает ваш код чище и упростит обнаружение ошибок.

Я не вижу, как выглядит ваша db() функция, но, надеюсь, она должна выглядеть примерно так. Посмотрите, насколько проще этот код:

function db(): \mysqli {
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new \mysqli('localhost', 'username', 'password', 'testdb');
    $mysqli->set_charset('utf8mb4'); // always set the charset
    return $mysqli;
}

$conn = db();

$id = 1;
$sql = "UPDATE instagram SET token=?, expires=? WHERE id=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param('sss', $tokenAccess, $tokenExpires, $id);
$stmt->execute();

О вашей реальной проблеме:
Вероятно, проблем не было вообще. affected_rows указывает, что 1 строка была обновлена.

1 голос
/ 03 марта 2020

Вы используете подготовленные операторы, поэтому ваши коды в выражении where должны быть такими: WHERE id = ?";

$id = '1'; 
$tokenAccess = $_POST['token']; 
$tokenExpires = $_POST['expires'];
//Make sure you are passing these values to php 
try {
    $conn = db();
    $sql = "UPDATE instagram SET token=?, expires=? WHERE id = ?";
    $stmt = mysqli_stmt_init($conn);

    if (!mysqli_stmt_prepare($stmt, $sql)) {
        throw new Exception($conn->error);
    }

    mysqli_stmt_bind_param($stmt, "ssi", $tokenAccess, $tokenExpires, $id);
    //If $tokenExpires uses - OR / OR ETC.. you need to set it to varchar 
    // on error
    if (!mysqli_stmt_execute($stmt)) {
        throw new Exception($conn->error);
    }
    //you can return affected rows mysqli_stmt_affected_rows($stmt);
    var_dump($stmt);

    $stmt->close();
    $conn->close();
}
catch (Exception $e) {
    print_r($e);
}

См. Здесь: Как отладить Php код?

Вот как вы можете использовать: https://www.php.net/manual/en/mysqli-stmt.affected-rows.php

...