Обновите скрипт mysqli в оператор PDO - PullRequest
2 голосов
/ 12 марта 2019

Я новичок, и я делаю первые шаги в мире PDO, и я пытаюсь обновить этот скрипт с MySQL на PDO. Сценарий используется для удаления записей из базы данных через jQuery.

Новое соединение с БД mySql:

$host = "localhost"; 
$user = "root";
$password = ""; 
$dbname = "test-2"; 

try {
    $con = new PDO("mysql:host={$host};dbname={$dbname}", $user, $password);
}

// show error
catch(PDOException $exception){
    echo "Connection error: " . $exception->getMessage();
}

Проблема касается сценария DELETE. Это оригинал (взят из этого урока: https://makitweb.com/how-to-delete-record-from-mysql-table-with-ajax) со ссылками на старое соединение.

include "config.php";

$id = $_POST['id'];

if($id > 0){

  // Check record exists
  $checkRecord = mysqli_query($con,"SELECT * FROM gallery WHERE id_gallery=".$id);
  $totalrows = mysqli_num_rows($checkRecord);

  if($totalrows > 0){
    // Delete record
    $query = "DELETE FROM gallery WHERE id_gallery=".$id;
    mysqli_query($con,$query);
    echo 1;
    exit;
  }
}

echo 0;
exit;

и тот же скрипт, который я пытаюсь обновить. Он не работает, потому что он дает мне предупреждение « неверный идентификатор ».

include "config.php";

$id = $_POST['id'];

if($id > 0){

  // Check record exists
  $checkRecord = "SELECT * FROM gallery WHERE id_gallery=".$id;
  $stmt = $con->prepare($checkRecord);
    $stmt->bindParam(1, $id);
     $stmt->execute();

  $totalrows = $stmt->fetchColumn()

  if($totalrows > 0){
    // Delete record
    $query = "DELETE FROM gallery WHERE id_gallery=".$id;
    $stmt = $con->prepare($query);
    $stmt->bindParam(1, $id);
    $stmt->execute();
    echo 1;
    exit;
  }
}

echo 0;
exit;

script.js

    $(document).ready(function(){

    $('.delete').click(function(){
        var el = this;
        var id = this.id;
        var splitid = id.split("_");

        // Delete id
        var deleteid = splitid[1];

        // AJAX Request
        $.ajax({
            url: 'remove.php',
            type: 'POST',
            data: { id:deleteid },
            success: function(response){

                if(response == 1){
                    // Remove row from HTML Table
                    $(el).closest('tr').css('background','tomato');
                    $(el).closest('tr').fadeOut(800,function(){
                        $(this).remove();
                    });
                }else{
                    alert('Invalid ID.');
                }
            }
        });
    });
});

Ответы [ 2 ]

3 голосов
/ 12 марта 2019

Ни ваш исходный код mysqli, ни ваш код PDO фактически не создают никаких связанных параметров.

У вас есть это:

$checkRecord = "SELECT * FROM gallery WHERE id_gallery=".$id;
$stmt = $con->prepare($checkRecord);
$stmt->bindParam(1, $id);
$stmt->execute();

Нет сомнений, что PDO запутывается, когда вы запрашиваете bindParam (), поскольку вы не поместили никаких заполнителей параметров в запрос SQL."Привязать параметр ... к чему ??"это справедливо удивляет.

Вы должны использовать это:

$checkRecord = "SELECT * FROM gallery WHERE id_gallery=?";
$stmt = $con->prepare($checkRecord);
$stmt->execute([$id]);

Больше примеров кода можно найти в документации для PDO :: prepare () .

0 голосов
/ 12 марта 2019

Первый вопрос, действительно ли мне нужно запустить этот выбор? Я предлагаю код ниже

    include "config.php";

    $id = $_POST['id'];

    if($id > 0){

      // Delete record
      $checkRecord = "DELETE FROM gallery WHERE id_gallery= :id ";
      $stmt = $con->prepare($checkRecord);
      $stmt->bindParam(":id", $id, PDO::PARAM_INT);      

      // It executes the delete, if any record is deleted, it will print "Registration deleted"
      if($stmt->execute()){
        echo "Registration deleted";
      }else{
        echo "Id does not exist";
      }
    }
exit;

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

- PDO :: PARAM_STR - para valores строки, данные, horas…

- PDO :: PARAM_INT - para valores inteiros

- PDO :: PARAM_BOOL - para valor booleano (true ou false)

- PDO :: PARAM_NULL - valor nulo (null)

- PDO :: PARAM_LOB - представительство в высшем образовании

- PDO :: PARAM_STMT - представление данных реестра, atualmente não é suportado por nenhum driver

- PDO :: PARAM_INPUT_OUTPUT - особые требования к параметрам саида пара «хранимые процедуры»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...