У меня возникли проблемы с приложением, которое недавно перестало работать, и я не могу понять, в чем проблема.
Чтение из базы данных работает хорошо, но когда я пытаюсь вставить или обновить существующую запись, это не работает.Иногда значение поля записи устанавливается равным нулю вместо значения переменной.
Это приложение в настоящее время работает на общем хосте, и оно работало нормально от нескольких месяцев до недели назад.Я имею экземпляр 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 было отключено.При включенном выше работают приведенные выше примеры, и мое приложение теперь работает.