Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么在mysqli中准备语句时会出现SQL错误?_Php_Mysql_Mysqli_Prepared Statement - Fatal编程技术网

Php 为什么在mysqli中准备语句时会出现SQL错误?

Php 为什么在mysqli中准备语句时会出现SQL错误?,php,mysql,mysqli,prepared-statement,Php,Mysql,Mysqli,Prepared Statement,我有以下疑问: INSERT INTO ipi_messages (Message_userID, Message_fromName, Message_fromEmail, Message_subject, Message_body) VALUES(0, 'hope', 'thisworks@gmail.com', 'i hope', 'this works') 我得到以下MySQL错误: You have an error in your SQL syntax; check the manu

我有以下疑问:

INSERT INTO ipi_messages (Message_userID, Message_fromName, Message_fromEmail, Message_subject, Message_body) VALUES(0, 'hope', 'thisworks@gmail.com', 'i hope', 'this works')
我得到以下MySQL错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0' at line 1
以下是我的表模式:

以下是我的主要PHP代码:

<?php
    require 'lib/class.Database.php';
    require 'lib/class.Messages.php';

    $messageDatabase = new Database('ipi2');
    $messageDatabase->newDatabaseUsers([
                                        ['Query','ipi_query','k2QvHmtxGhVN'],
                                        ['admin','ipi_admin','r0HHRsQ76kS2']
                                        ]);
    $messageDatabase->makeConnection('admin');

    var_dump($_POST);

    if(array_key_exists('sendMessage', $_POST)){
        // $query = "INSERT INTO ipi_messages (Message_userID, Message_fromName, Message_fromEmail, Message_subject, Message_body) VALUES(?,?,?,?,?)";
        // $result = $messageDatabase->query($query, $_POST['to'], $_POST['fromName'], $_POST['fromEmail'], $_POST['subject'], $_POST['message']);

        $messages = new Messages($messageDatabase);
        $messages->postMessage([
                                'Message_userID' => (int)$_POST['to'],
                                'Message_fromName' => $_POST['fromName'],
                                'Message_fromEmail' => $_POST['fromEmail'],
                                'Message_subject' => $_POST['subject'],
                                'Message_body' => $_POST['message']
                                ]);
    }

    if(array_key_exists('getMessages', $_POST)){
        $query_get = "SELECT * FROM ipi_messages WHERE Message_userID = ?";
        $result_get = $messageDatabase->query($query_get, $_POST['user']);
    }
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Messages</title>
    <style type="text/css">h5, h6{margin: 0;padding: 0;}</style>
</head>
<body>
    <h3>Send Message</h3>
    <form name="sendMessage" method="post" action="">
        <h5>To:</h5>
        <select name="to">
            <option value=""></option>
            <option value="0">Fillip Peyton</option>
            <option value="1">Fillswitch</option>
        </select>
        <br/>

        <h5>Name:</h5>
        <input type="text" name="fromName">
        <h5>Email:</h5>
        <input type="text" name="fromEmail">
        <h5>Subject:</h5>
        <input type="text" name="subject">
        <h5>Message:</h5>
        <textarea name="message"></textarea>
        <br/>

        <input type="submit" name="sendMessage" value="Send">
    </form>

    <h3>Your Messages:</h3>
    <form name="getMessages" method="post" action="">
        <select name="user">
            <option value=""></option>
            <option value="0">Fillip Peyton</option>
            <option value="1">Fillswitch</option>
        </select>
        <input type="submit" name="getMessages" value="Get Messages">
        <?php
            if (isset($result_get)) {
                foreach ($result_get as $result) {
        ?>
                    <p>
                        <b><?php echo $result['Message_fromName']; ?></b><br/>
                        <?php echo $result['Message_fromEmail']; ?><br/>
                        <i><?php echo $result['Message_subject']; ?></i><br/>
                        <?php echo $result['Message_body']; ?>
                    </p><hr>
        <?php
                }
            }
        ?>
    </form>
</body>
</html>

信息
h5,h6{边距:0;填充:0;}
发送消息
致:
菲利普佩顿
填充开关

姓名: 电邮: 主题: 信息:
您的信息: 菲利普佩顿 填充开关



class.Messages.php:

<?php
require_once 'lib/classFunctions.php';

class Messages
{
    protected $database;
    protected $userID = -1;

    public function __construct(Database $messageDatabase) {
        $this->database = $messageDatabase;
    }

    public function getMessages($userID = null){

    }

    public function postMessage(Array $columnsValues){
        // $query = "INSERT INTO ipi_messages (Message_userID, Message_fromName, Message_fromEmail, Message_subject, Message_body) VALUES(?,?,?,?,?)";

        $columns = '';
        $values = '';
        $queryParams = array();

        foreach ($columnsValues as $column => $value) {
            $columns .= "$column, ";
            $values .= is_int($value) ? "$value, " : "'$value', ";
            $queryParams[] = $value;
        }

        $columns = substr($columns, 0, strlen($columns) - 2);
        $values = substr($values, 0, strlen($values) - 2);

        $query = "INSERT INTO ipi_messages ($columns) VALUES($values)";

        // array_unshift($queryParams, $query);

        // $result = $messageDatabase->query($query, $_POST['to'], $_POST['fromName'], $_POST['fromEmail'], $_POST['subject'], $_POST['message']);
        echo $query . '<br/>';
        return $result = call_user_func_array(array($this->database,'query'), refValues($queryParams));
    }

    public function deleteMessage(){}
}

我重新创建了您的模式,并使用您的查询插入了两行,一行来自MySQL命令行,另一行来自PhpMyAdmin。截图如下:。您的查询似乎有效,因此问题出在其他地方(可能在PHP代码中)

这不是您的问题,但正如其他人所提到的,Message_userID的数据类型是INT,您在表示字符串的引号中有0

  • 错误不是引用部分的,而是引用部分之前的。因此,尽管有许多评论,但“0”本身并没有什么问题
  • 一眼就看不到错误-因此,您必须调试代码。
    • 首先,您必须确保引用的查询是同一个有错误的查询。您必须始终将文件名和行号与错误消息放在一起。要做到这一点,它必须是
      trigger\u error($myqli->error。“[$sql]”),而不是通常无用的
      die($myqli->error)
    • 将查询拆分为多行也是一个好主意,以使错误消息更具信息性

  • 我终于明白我做错了什么。我之所以会出现这个错误,是因为我将实际值放入了sql的
    values()
    部分。这样,当我的
    bind_param
    方法尝试绑定值时,它没有要绑定的
    标记,而是看到了实际值

    我的新class.Messages.php如下所示:

    <?php
    require_once 'lib/classFunctions.php';
    
    class Messages
    {
        protected $database;
        protected $userID = -1;
    
        public function __construct(Database $messageDatabase) {
            $this->database = $messageDatabase;
        }
    
        public function getMessages($userID = null){
    
        }
    
        public function postMessage(Array $columnsValues){
            $columns = '';
            $values = '';
            $queryParams = array();
    
            foreach ($columnsValues as $column => $value) {
                $columns .= "$column, ";
                $values .= "?, ";
                $queryParams[] = $value;
            }
    
            $columns = substr($columns, 0, strlen($columns) - 2);
            $values = substr($values, 0, strlen($values) - 2);
    
            $query = "INSERT INTO ipi_messages ($columns) VALUES($values)";
    
            array_unshift($queryParams, $query);
    
            return $result = call_user_func_array(array($this->database,'query'), refValues($queryParams));
        }
    
        public function deleteMessage(){}
    }
    

    '0'
    是一个字符串
    0
    应该是一个数字(尽管我很惊讶MySQL如此挑剔)不应该是。我刚刚重新创建了这个架构并运行了查询,它在phpmyadmin中运行得很好。这匹马告诉你的和我在这里告诉你的一样:我尝试了不带引号的0,就像wazy那样。没有骰子。你能把php代码放在嵌入的地方吗?
    <?php
    function refValues($arr){
        if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
        {
            $refs = array();
            foreach($arr as $key => $value)
                $refs[$key] = &$arr[$key];
            return $refs;
        }
        return $arr;
    }
    
    <?php
    require_once 'lib/classFunctions.php';
    
    class Messages
    {
        protected $database;
        protected $userID = -1;
    
        public function __construct(Database $messageDatabase) {
            $this->database = $messageDatabase;
        }
    
        public function getMessages($userID = null){
    
        }
    
        public function postMessage(Array $columnsValues){
            $columns = '';
            $values = '';
            $queryParams = array();
    
            foreach ($columnsValues as $column => $value) {
                $columns .= "$column, ";
                $values .= "?, ";
                $queryParams[] = $value;
            }
    
            $columns = substr($columns, 0, strlen($columns) - 2);
            $values = substr($values, 0, strlen($values) - 2);
    
            $query = "INSERT INTO ipi_messages ($columns) VALUES($values)";
    
            array_unshift($queryParams, $query);
    
            return $result = call_user_func_array(array($this->database,'query'), refValues($queryParams));
        }
    
        public function deleteMessage(){}
    }