Ошибка подключения: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 - PullRequest
0 голосов
/ 06 декабря 2018

Я уже видел много вопросов, похожих на мои, но у меня все по-другому: моя ошибка не вызвана использованием "keyword" в SQL!

, когда я запускаю свой код, если яотмените предложение WHERE или я использую жестко закодированное значение, такое как " WHERE customerNumber = 356", оно работает нормально, но если я пытаюсь использовать значение переменной $custom_n, выдается ошибка.

<?php 
            $custom_n = $_POST["emp"];
            $servername = "localhost";
            $username = "root";
            $password = "";

            try {
                $conn = new PDO("mysql:host=$servername;dbname=classicmodels", $username, $password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                $stmt = $conn -> prepare("SELECT phone, salesRepEmployeeNumber, creditLimit FROM customers WHERE customerNumber = $custom_n");
                $stmt -> execute();
                $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
                foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
                    echo $v;
                }
            }
            catch(PDOException $e) {
                echo "Connection failed: " . $e->getMessage();
            }

            $conn = null;

        ?>

Если я выполняю эхо для custom_n и gettype, я получаю: 353 строку, что я и хотел.

Это полная ошибка:

Ошибка подключения: SQLSTATE [42000]: Синтаксисошибка или нарушение прав доступа: 1064 У вас ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с '' в строке 1

Как подсказал Магнус Эрикссон, если я сделаю var_dump($custom_n);, я получу следующий вывод: string(12) ""

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Предпочтительным способом является обязательный.Вы можете связать с param, как это.Вы можете сослаться на здесь

$stmt = $conn -> prepare("SELECT phone, salesRepEmployeeNumber, creditLimit FROM customers WHERE customerNumber = :customernumber");

$stmt->bindParam(':customernumber', $custom_n, PDO::PARAM_INT);
0 голосов
/ 06 декабря 2018

Как предположил Магнус Эрикссон, была проблема с моим методом POST ... даже если это казалось нормальным, у моей переменной custom_n был странный вывод var_dump string(12)"".Я помню, что я использовал тот же код ранее и работал, поэтому я просто изменяю код, чтобы он был точно таким же: на странице, на которой у меня есть форма, которая отправляет «переменную POST», я использовал этот код:

<?php 

            $servername = "localhost";
            $username = "root";
            $password = "";

            $custom_n = array();

            try {
                $conn = new PDO("mysql:host=$servername;dbname=classicmodels", $username, $password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                $stmt = $conn -> prepare("SELECT checkNumber, paymentDate, amount, customerNumber FROM payments ORDER BY paymentDate DESC");
                $stmt -> execute();
                $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
                foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
                    echo $v;
                    if ($k == 'customerNumber') {
                        array_push($custom_n, $v);
                    }
                }

                $tableCodes = "<table id='buttons'>";
                foreach ($custom_n as $c) {
                    $tableCodes .= "
                        <tr>
                            <td>
                                <form action='customers.php' method='post' target='POPUPW' onsubmit=\"POPUPW = window.open('about:blank','POPUPW', 'width=800px,height=600px');\">
                                    <button type='submit' name='code' value='$c'>Details</button>
                                </form>
                            </td>
                        </tr>
                    ";
                }
                $tableCodes .= "</table>";
                echo $tableCodes;
            }
            catch(PDOException $e) {
                echo "Connection failed: " . $e->getMessage();
            }

            $conn = null;

        ?>

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

<?php 

            $servername = "localhost";
            $username = "root";
            $password = "";

            try {
                $conn = new PDO("mysql:host=$servername;dbname=classicmodels", $username, $password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                $stmt = $conn -> prepare("SELECT checkNumber, paymentDate, amount, customerNumber FROM payments ORDER BY paymentDate DESC");
                $stmt -> execute();
                $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
                foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
                    echo $v; 
                }

                $customQuery = $conn -> prepare("SELECT customerNumber FROM payments ORDER BY paymentDate DESC");
                $customQuery -> execute();
                $custom = $customQuery->fetchAll(PDO::FETCH_COLUMN);
                $tableCodes = "<table id='buttons'>";
                foreach ($custom as $c) {
                    $tableCodes .= "
                        <tr>
                            <td>
                                <form action='customers.php' method='post' target='POPUPW' onsubmit=\"POPUPW = window.open('about:blank','POPUPW', 'width=800px,height=600px');\">
                                    <button type='submit' name='emp' value='$c'>Details</button>
                                </form>
                            </td>
                        </tr>
                    ";
                }
                $tableCodes .= "</table>";
                echo $tableCodes;
            }
            catch(PDOException $e) {
                echo "Connection failed: " . $e->getMessage();
            }

            $conn = null;

        ?>

Я должен поблагодарить всех, в частности, MagnusEriksson, MasivuyeCokile и Pr1nc3, о которых я никогда не узналПодготовленные параметры.Большое спасибо, и если вы узнаете, почему предыдущий код не работал, не стесняйтесь комментировать: D.

0 голосов
/ 06 декабря 2018
$stmt = $conn -> prepare("SELECT phone, salesRepEmployeeNumber, creditLimit FROM customers WHERE customerNumber = ?");
$stmt->execute(array($custom_n));

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

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