PHP MySQLi подготовленные операторы, кажется, не связывают и не передают переменные - но работают с подготовкой PDO - PullRequest
0 голосов
/ 21 мая 2018

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

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

Это приложение в настоящее время работает на общем хосте, и оно работало нормально от нескольких месяцев до недели назад.Я имею экземпляр UAT, сидящий на другом хосте с другим провайдером, и он, кажется, работает без проблем.

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

PHP / MySQL не выдает никаких ошибок.

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

Это работает:

<?php
    // Connection file
    require 'connection.php';

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    // set parameters and execute
    $firstname = htmlspecialchars($_GET["firstname"]);

    $sql = "UPDATE users SET first_name='$firstname' WHERE uid=1";

    if ($conn->query($sql) === TRUE) {
        echo "Updated record successfully";
    } else {
        echo "Error updating record: " . $conn->error;
    }

    $conn->close();
    ?>

Пока это не так:

<?php
    // Connection file
    require 'connection.php';

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    // set parameters and execute
    $firstname = htmlspecialchars($_GET["firstname"]);

    // prepare and bind
    $stmt = $conn->prepare("UPDATE users SET first_name=? WHERE uid =1");
    $stmt->bind_param("s", $firstname);


    $stmt->execute();

    echo "Updated record successfully";

    $stmt->close();
    $conn->close();
    ?>

Я использую PHP v7.0.30, Apache v2.4.33 и MySQL v10.2.15 (MariaDB)

Любые идеи.Это сводит меня с ума ...

Я только что попытался вернуть количество затронутых строк для второго примера.

printf("Affected rows (UPDATE): %d\n", $stmt ->affected_rows);

Если first_name в таблице базы данных имеет значение,и я запускаю скрипт, выводящий количество строк, он возвращает 'Затронутые строки 1' .Когда я проверяю базу данных, я вижу, что значение теперь пусто.

Что может вызвать это?Возможно, какая-то проблема с кодировкой?

ОБНОВЛЕНИЕ 1

Только что добавлено var_dump ($ stmt, $ firstname);ко второму примеру после привязки.

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

Затрагиваемые строки: 1

и

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

Затронутые строки: 0`

ОБНОВЛЕНИЕ2

Я начинаю думать, что это проблема с сервером.Я только что протестировал обновление записи с использованием подготовки PDO, и она работает.

<?php
    // Connection file
    require 'connection.php';

    // set parameters
    $firstname = $_GET["firstname"];
    $id = 1;

    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // prepare sql and bind parameters
        $stmt = $conn->prepare("UPDATE users SET first_name=? WHERE uid=?");
        $stmt->execute([$firstname,$id]);

        }
    catch(PDOException $e)
        {
        echo "Error: " . $e->getMessage();
        }
    $conn = null;

?>

Когда я пытаюсь выполнить подготовленный оператор для SELECT, я получаю '503 Service Unavailable'.Локально работает.

<?php
    // Connection file
    require 'connection.php';

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    // set parameters and execute
    $id = 1;

    //create a prepared statement
    $query = "SELECT first_name FROM users WHERE uid=?";
    $stmt  = $conn->prepare($query);

    $stmt ->bind_param('i', $id);

    //execute query
    $stmt ->execute();

    //bind result variables
    $stmt ->bind_result($first_name);

    //fetch records
    while($stmt ->fetch()) {
        print $first_name;
    }   

    //close connection
    $stmt ->close();

    mysqli_close($conn);
?>

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ - ВОПРОС РЕШЕНО

Мой хостинг-провайдер смог решить эту проблему.Похоже, что расширение PHP nd_mysqli было отключено.При включенном выше работают приведенные выше примеры, и мое приложение теперь работает.

1 Ответ

0 голосов
/ 22 мая 2018

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ - ВОПРОС РАЗРЕШЕН

Мой хостинг-провайдер смог решить эту проблему.Похоже, что расширение PHP nd_mysqli было отключено.При включенном выше работают приведенные выше примеры, и мое приложение теперь работает.

...