Ошибка: SQLSTATE [42000]: Syntax ошибка or access violation: 1064

У меня выходит ошибка, захотев произвести действие, как изменение или сохранять.

Ошибка:

SQLSTATE [42000]: Syntax ошибка or access violation: 1064 You have an ошибка in your SQL syntax; check the учебник that corresponds to your MariaDB server версия for the right syntax to использовал near 'WHERE код = '1002'' at line 6

Код:

<?php
require_once 'producto.php';
require_once 'productoalta.php';

// Logica
$alm = new productos();
$model = new productosalta();

if(isset($_REQUEST['action']))
{
    switch($_REQUEST['action'])
    {
        case 'actualizar':
            $alm->__SET('codigo',              $_REQUEST['codigo']);
            $alm->__SET('producto',          $_REQUEST['producto']);
            $alm->__SET('descripcion',        $_REQUEST['descripcion']);
            $alm->__SET('precio',            $_REQUEST['precio']);


            $model->Actualizar($alm);
            header('Location: index.php');
            break;

        case 'registrar':
            $alm->__SET('producto',          $_REQUEST['producto']);
            $alm->__SET('descripcion',        $_REQUEST['descripcion']);
            $alm->__SET('precio',            $_REQUEST['precio']);


            $model->Registrar($alm);
            header('Location: index.php');
            break;

        case 'eliminar':
            $model->Eliminar($_REQUEST['codigo']);
            header('Location: index.php');
            break;

        case 'editar':
            $alm = $model->Obtener($_REQUEST['codigo']);
            break;
    }
}

?>

<!DOCTYPE html>
<html lang="es">
    <head>
        <title>si</title>
        <link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.5.0/pure-min.css">
    </head>
    <body style="padding:15px;">

        <div class="pure-g">
            <div class="pure-u-1-12">

                <form action="?action=<?php echo $alm->codigo > 0 ? 'actualizar' : 'registrar'; ?>" method="post" class="pure-form pure-form-stacked" style="margin-bottom:30px;">
                    <input type="hidden" name="codigo" value="<?php echo $alm->__GET('codigo'); ?>" />

                    <table style="width:500px;">
                        <tr>
                            <th style="text-align:left;">producto</th>
                            <td><input type="text" name="producto" value="<?php echo $alm->__GET('producto'); ?>" style="width:100%;" /></td>
                        </tr>
                        <tr>
                            <th style="text-align:left;">descripcion</th>
                            <td><input type="text" name="descripcion" value="<?php echo $alm->__GET('descripcion'); ?>" style="width:100%;" /></td>
                        </tr>
                        <tr>
                            <th style="text-align:left;">precio</th>


                                    <td><input type="text" name="precio" value="<?php echo $alm->__GET('precio'); ?>" style="width:100%;" /></td>
                                </select>
                            </td>
                        </tr>

                        <tr>
                            <td colspan="2">
                                <button type="submit" class="pure-button pure-button-primary">Guardar</button>
                            </td>
                        </tr>
                    </table>
                </form>

                <table class="pure-table pure-table-horizontal">
                    <thead>
                        <tr>
                            <th style="text-align:left;">producto</th>
                            <th style="text-align:left;">descripcion</th>
                            <th style="text-align:left;">precio</th>
                            <th style="text-align:left;">Nacimiento</th>
                            <th></th>
                            <th></th>
                        </tr>
                    </thead>
                    <?php foreach($model->Listar() as $r): ?>
                        <tr>
                            <td><?php echo $r->__GET('producto'); ?></td>
                            <td><?php echo $r->__GET('descripcion'); ?></td>
                            <td><?php echo $r->__GET('precio') == 1 ? 'H' : 'F'; ?></td>

                            <td>
                                <a href="?action=editar&codigo=<?php echo $r->codigo; ?>">Editar</a>
                            </td>
                            <td>
                                <a href="?action=eliminar&codigo=<?php echo $r->codigo; ?>">Eliminar</a>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                </table>     

            </div>
        </div>

    </body>
</html>

Код 2

<?php
class productosalta
{
    private $pdo;

    public function __CONSTRUCT()
    {
        try
        {
            $this->pdo = new PDO('mysql:host=localhost;dbname=carro_compras', 'root', '');
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);                
        }
        catch(Exception $e)
        {
            die($e->getMessage());
        }
    }

    public function Listar()
    {
        try
        {
            $result = array();

            $stm = $this->pdo->prepare("SELECT * FROM productos");
            $stm->execute();

            foreach($stm->fetchAll(PDO::FETCH_OBJ) as $r)
            {
                $alm = new productos();

                $alm->__SET('codigo', $r->codigo);
                $alm->__SET('producto', $r->producto);
                $alm->__SET('descripcion', $r->descripcion);
                $alm->__SET('precio', $r->precio);


                $result[] = $alm;
            }

            return $result;
        }
        catch(Exception $e)
        {
            die($e->getMessage());
        }
    }

    public function Obtener($codigo)
    {
        try 
        {
            $stm = $this->pdo
                      ->prepare("SELECT * FROM productos WHERE codigo = ?");


            $stm->execute(array($codigo));
            $r = $stm->fetch(PDO::FETCH_OBJ);

            $alm = new productos();

            $alm->__SET('codigo', $r->codigo);
            $alm->__SET('producto', $r->producto);
            $alm->__SET('descripcion', $r->descripcion);
            $alm->__SET('precio', $r->precio);


            return $alm;
        } catch (Exception $e) 
        {
            die($e->getMessage());
        }
    }

    public function Eliminar($codigo)
    {
        try 
        {
            $stm = $this->pdo
                      ->prepare("DELETE FROM productos WHERE codigo = ?");                    

            $stm->execute(array($codigo));
        } catch (Exception $e) 
        {
            die($e->getMessage());
        }
    }

    public function Actualizar(productos $data)
    {
        try 
        {
            $sql = "UPDATE productos SET 
                        producto          = ?, 
                        descripcion        = ?,
                        precio            = ?, 

                    WHERE codigo = ?";

            $this->pdo->prepare($sql)
                 ->execute(
                array(
                    $data->__GET('producto'), 
                    $data->__GET('descripcion'), 
                    $data->__GET('precio'),

                    $data->__GET('codigo')
                    )
                );
        } catch (Exception $e) 
        {
            die($e->getMessage());
        }
    }

    public function Registrar(productos $data)
    {
        try 
        {
        $sql = "INSERT INTO productos (producto,descripcion,precio) 
                VALUES (?, ?, ?, ?)";

        $this->pdo->prepare($sql)
             ->execute(
            array(
                $data->__GET('producto'), 
                $data->__GET('descripcion'), 
                $data->__GET('precio'),

                )
            );
        } catch (Exception $e) 
        {
            die($e->getMessage());
        }
    }
}
?>

Код 3

<?php
class productos
{


    private $codigo;
    private $producto;
    private $descripcion;
    private $precio;


    public function __GET($k){ return $this->$k; }
    public function __SET($k, $v){ return $this->$k = $v; }
}
?>
1
задан 03.05.2017, 19:37
1 ответ

Когда он находится в способе соревнования PDO::ATTR_EMULATE_PREPARES (который включен по умолчанию), PDO замени закладки положения (Placeholder) с настоящими данными.

И с ленивой связью (используя array в execute()), PDO отнесись к каждому параметру как к цепи (string).

Как пример, готовый предел ?,? в консультацию он превращается в LIMIT '10', '10' что является не действительным синтаксисом, который способствует тому, чтобы консультация не удалась.

Есть два решения:

  • Дезактивируй соревнование (MySQL может упорядочивать все закладки положения (placeholder) правильно).

  • Связывать число ясно и устанавливать соответствующий тип (PDO::PARAM_INT) для этой переменной.

Чтобы дезактивировать соревнование, возможно выполнять этот код (или устанавливать в одной договоренность выборов связи):

$conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

Или чтобы соединять эти переменные ясно с типом параметра:

$stm = $pdo->prepare('SELECT * FROM table LIMIT ?, ?');
$stm->bindParam(1, $limit_from, PDO::PARAM_INT);
$stm->bindParam(2, $per_page, PDO::PARAM_INT);
$stm->execute();
$data = $stm->fetchAll();

Первоначальный шрифт на Английском языке

Решение в твоем случае добавляет:

$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
1
ответ дан 24.11.2019, 12:04

Теги

Похожие вопросы