Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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、准备语句和插入选择_Php_Mysql_Mysqli_Prepared Statement - Fatal编程技术网

Php mysqli、准备语句和插入选择

Php mysqli、准备语句和插入选择,php,mysql,mysqli,prepared-statement,Php,Mysql,Mysqli,Prepared Statement,让我们假设我在InnoDB数据库中有两个表:类别和笑话;我正在使用PHP/MySQLi来完成这项工作。这些表看起来是这样的: CATEGORIES id (int, primary, auto_inc) | category_name (varchar[64]) ============================================================ 1 knock, knock JOKES id

让我们假设我在InnoDB数据库中有两个表:
类别
笑话
;我正在使用PHP/MySQLi来完成这项工作。这些表看起来是这样的:

CATEGORIES
id (int, primary, auto_inc)  |  category_name (varchar[64])
============================================================
1                               knock, knock

JOKES
id (int, primary, auto_inc)  |  category_id (int)  | joke_text (varchar[255])
=============================================================================
empty
多亏了这里的答案,我发现您可以执行以下操作来添加一个新笑话,包括:
$joke\u text
$category\u id

INSERT INTO jokes (category_id, joke_text)
SELECT c.id, '$joke_text'
FROM categories AS c WHERE c.id = $category_id;
这使我能够在不使用外键的情况下确保
$category\u id
值引用现有类别(请忽略外键问题,因为我的问题旨在帮助我学习“复杂的”准备语句)

所以这很好。然而,我现在正在努力学习准备好的陈述,在花了一整天的时间之后,我终于掌握了基本知识。不幸的是,我完全不知道如何在mysqli下用准备好的语句执行上述SQL查询,而且我还无法在网上找到任何关于这个问题的信息


如果有人能帮助我,我将非常感激。

首先,您创建的声明与您所做的正常声明非常相似

$stmt = $mysqli->prepare("INSERT INTO jokes (category_id, joke_text)
SELECT c.id, ?
FROM categories AS c WHERE c.id = ?;");
获取绑定到参数“s”的语句,该参数表示字符串数据,i表示整数

$stmt->bind_param('si', $joke_text,$category_id);   // bind to the parameters
/*执行准备好的语句*/

$stmt->execute();

我实际上在写一些代码,但我意识到你也在网上搜索这个。因此,我给了你一个PHP网站的链接,在那里你可以看到很多这样的内容

既然您正在学习MySQLi,为什么不直接转到PDO呢。这很相似,但我认为这就是未来的发展方向


使用mysqli real\u escape\u string函数对POST数据进行转义不是违背了使用准备语句的目的吗?您可以使用准备好的语句跳过该步骤。否则,您可能需要调用addslashes函数,然后使用real_escape_string函数对其进行转义。或者这至少是我在迁移到PDO之前第一次使用MySQLi时读到的。看,我同意,这只是一个习惯:)可以安全地删除双转义可能会在发送一个单引号时给你两个单引号。这就是我看到安全问题的地方。我们建议最好改掉这个习惯。:)嗯,也许这看起来比实际情况复杂得多。但是,我不想为
WHERE c.id=$category\u id
语句添加一个
?因此,它将是:
其中c.id=?
,然后我将添加
$category\u id
作为
stmt->bind\u param
上的第二个参数。这不是必需的,您只需要从外部源添加参数,这是从db获取数据