PHP mysqli准备错误

时间:2016-09-29 16:43:06

标签: php mysql mysqli

首先,我需要说我已经搜索了超过2小时,但没有找到任何可以帮助我的答案! 所以这是我的问题: 每当我尝试执行该代码时:

    if(isset($_GET['name'])){ #Line 65
        $name = $_GET['name']; #Line 66
        $test = $mysqli->prepare('SELECT * FROM `SkyWars_Stats` WHERE player_uuid = ":name"'); #Line 67
        $test->bind_param(array('name' => $name)); #Line 68
        $test->execute(); #Line 69
    }

我收到此错误:

  

[Thu Sep 29 18:43:13.035006 2016] [:error] [pid 11506] [客户 :* ****] PHP警告:第68行/var/www/html/stats/index.php中mysqli_stmt :: bind_param()的参数计数错误

Sooooo我做错了什么?

感谢您的帮助:)

2 个答案:

答案 0 :(得分:2)

首先,您在命名占位符中使用引号:

case class Person(name: String, Age: Int, country: String)
// defined class Person

val personList = List(
  Person("person_1", 20, "country_1"),
  Person("person_2", 30, "country_2")
)
// personList: List[Person] = List(Person(person_1,20,country_1), Person(person_2,30,country_2))

val tupleList = personList.flatMap(person => Person.unapply(person))
// tupleList: List[(String, Int, String)] = List((person_1,20,country_1), (person_2,30,country_2))

val wantedTupleList = tupleList.map({ case (name, age, country) => (age, country) })
// wantedTupleList: List[(Int, String)] = List((20,country_1), (30,country_2))

// the above is more easy to understand but will cause two parses of list
// better is to do it in one parse only, like following

val yourList = personList.flatMap(person => {
  Person.unapply(person) match {
    case (name, age, country) => (age, country)
  }
})
// yourList: List[(Int, String)] = List((20,country_1), (30,country_2))

需要删除。

然后这也是PDO语法:

WHERE player_uuid = ":name"

但是,您在这里使用的bind_param(array('name' => $name)) ^^^^^^^^^^^^^^^^^^^^^^ 函数不支持命名占位符,PDO会这样做。

如果您使用MySQLi_ API进行连接,则需要使用mysqli_占位符。

如果您要与PDO建立联系,则需要将?更改为bind_param()

不同的MySQL API不会混用。

有关预准备语句的MySQLi_语法,请参阅:

有关预准备语句的PDO语法,请参阅:

为相应的功能使用相同的连接API。

  • 您的连接方法/ API未知。

还要确保您的GET数组包含值。

通过PHP检查错误:

如果您从表单中获取这些内容,请确保它不使用POST方法。

因此,根据您用于连接的API,您可以使用以下内容来帮助您检查查询中的错误:

只有“你”知道正在使用哪一个。

但是,您在此处标记为$stmt->bindParam(':name', $name);,因此这表明您可能正在使用MySQLi_ API进行连接。如果是,请按照上面的例子进行操作。

如果是mysqli,那就更大了。

答案 1 :(得分:0)

您必须删除select语句中的双引号字符串

WHERE player_uuid = ":name"
  

Mysqli bind_param是否需要将数据类型传递给bind参数,以便与bind params一起执行查询

mysqli_stmt :: bind_param - mysqli_stmt_bind_param - 将变量绑定到预准备语句作为参数

面向对象的风格

bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )

程序风格

bool mysqli_stmt_bind_param ( mysqli_stmt $stmt , string $types , mixed &$var1 [, mixed &$... ] )

在传递给mysqli_prepare()的SQL语句中为参数标记绑定变量。

  

bind_param参数:

这是使用$stmt->bind_param()完成的;

此函数至少需要两个参数。

  1. 第一个是包含数据类型信息的字符串。
  2. 第二个是保存数据的变量。
  3. 信息字符串只能包含以下字符: b,d,i和s 。这些代表blob,double,integer和string。

    您需要在基于mysqli的规则中使用名为?的占位符,而您使用的:name完全不合适,您需要将其删除。

    示例:使用Mysqli bind_param

    $color = "purple";
    $stmt = $mysqli->stmt_init();
    if ($stmt->prepare("SELECT FirstName, LastName FROM Friends
        WHERE FavoriteColor = ?")) {
           $stmt->bind_param("s", $color);
           $stmt->execute();
           $result = $stmt->get_result();
           while ($row = $result->fetch_row()) {
               //do stuff with the data in the $row array
           }
           $result->close();
    }