Обновление в Perl DBI не работает, почему? (полный исходный код, включая DDL для создания базы данных в MySQL) - PullRequest
0 голосов
/ 24 марта 2011

Почему ОБНОВЛЕНИЕ в «Примере 2» не работает?

#   MySQL DDL to create database used by code 
#
#   CREATE DATABASE sampledb;
#
#   USE sampledb;
#   
#   CREATE TABLE `dbtable` (
#     `id`  int(11) NOT NULL AUTO_INCREMENT,
#     `demo` longtext,
#     PRIMARY KEY  (`id`)
#   ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# PERL MODULES WE WILL BE USING
use strict;
use warnings;
use DBI;

# CONFIG VARIABLES
my $platform = "mysql";
my $database = "sampledb";
my $host = "localhost";
my $port = "3306";
my $username = "root";
my $password = "password";

# DATA SOURCE NAME
my $dsn = "dbi:$platform:$database:$host:$port";

# PERL DBI CONNECT
my $connect = DBI->connect($dsn, $username, $password);

# VARS for Examples
my $query;
my $query_handle;
my $id;
my $demo;

# Example 1 using prepare() and execute() INSERT

    # SAMPLE VARIABLE AND VALUES TO PASS INTO SQL STATEMENT
    $id = 1;
    $demo = "test";

    # prepare() and execute() INSERT
    $query = "INSERT INTO dbtable (id, demo) VALUES ('$id', '$demo')";
    $query_handle = $connect->prepare($query);

    # EXECUTE THE INSERT
    $query_handle->execute();

    print STDERR "ERROR: $DBI::errstr";
    print STDERR "INFO: $query_handle rows updated";

    undef $query;

# Example 2 using do() UPDATE   

    # SAMPLE VARIABLE AND VALUES TO PASS INTO SQL STATEMENT
    $id = 2;
    $demo = "test 2";

    # do() THE UPDATE
    $query = "UPDATE dbtable SET demo = '$demo' WHERE id = $id;";
    $query_handle = $connect->prepare($query);

    # EXECUTE THE UPDATE
    $query_handle = $connect->do($query);

    print STDERR "ERROR: $DBI::errstr";
    print STDERR "INFO: $query_handle rows updated";

    undef $query;

Ответы [ 2 ]

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

Вы получаете ошибку в $ DBI :: errstr?Помимо любого выходного DBI, который я могу вам дать, первоначальная потенциальная проблема, которую я вижу, заключается в том, что вы вставляете строку с id = 1, но ваше обновление пытается обновить строки с id = 2.Там не будет никаких строк, где id = 2 для обновления.

Пара других вещей, о которых вы также можете знать.Подобная интерполяция ваших переменных прямо в ваши запросы является плохой практикой и ведет к атакам с использованием SQL-инъекций.Вы должны посмотреть документацию DBI по использованию заполнителей для этого.Заполнители также позволяют наиболее эффективно использовать метод prepare (), когда вам нужно выполнить один и тот же запрос для разных значений в цикле.Если вы просто сделали это, потому что это просто быстрая проверка, и вы не сделали бы это в «реальном» коде, то извините за беспокойство.

Вам также не нужно вызывать prepare () передделать().do () обрабатывает вызов функции prepare ().

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

Вы пытаетесь обновить запись с id = 2, который, кажется, не существует.

...