在PHP的预准备语句中设置SQL变量不起作用

盖伊

现状:我有一个结表中的列testFKquestionFKordinal

    testFK | questionFK | ordinal
       2         14          1
       2         15          2
       2         16          3
      _____________________________
 NEW   2         17          4

我想使用testFK = 2向表中添加新行questionFK = 17,但是,我希望ordinal根据表中已有的内容自动生成。由于最高序数是3,所以我想SQL自动生成4。

我试过了:

$stmt = $db->prepare('
        SET @QOrdinal = (SELECT MAX(ordinal) FROM junc_test_question WHERE testFK = ?);

        INSERT 
        INTO junc_test_question
        (junc_test_question.testFK, junc_test_question.questionFK, junc_test_question.ordinal)
        VALUES (?, ?, @QOrdinal);
    ');


    $stmt->bind_param('iii', $this->testID, $this->testID, $question_id);
    //var_dump($stmt);
    if($stmt->execute()) {
        return true;
    } else {
        return false;
    }

如果我对其中的硬代码进行编码,则此方法有效ordinal,但我似乎无法靠它SQL自己完成。

任何输入,不胜感激!

更新:我得到的错误

Fatal error:  Call to a member function bind_param() on a non-object in \classes\Test.php on line 91

因此,我假设的SQL是不正确的。

草莓

在操作人员最近的评论中,以下提出的解决方案不合适。

如果使用MyISAM表类型并定义一个主键,其中自动增量列为第二个主键,则MyISAM自动计算按第一个字段分组的增量(请参见链接文档中的MyISAM注释):

对于MyISAM表,可以在多列索引的第二列上指定AUTO_INCREMENT。在这种情况下,将为AUTO_INCREMENT列生成的值计算为MAX(auto_increment_column)+ 1 WHERE prefix = given-prefix。当您要将数据放入有序组中时,这很有用。

因此,您可以按如下所示简单地定义表-尽管实际上我不确定我是否会存储此序数:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(testFK INT NOT NULL
,ordinal INT NOT NULL AUTO_INCREMENT
,questionFK INT NOT NULL
,PRIMARY KEY(testFK,ordinal)
) ENGINE = MYISAM;

INSERT INTO my_table VALUES
(2,1,14),          
(2,2,15),          
(2,3,16);

INSERT INTO my_table (testFK,questionFK) VALUES
(2,17);

SELECT * FROM my_table;

+--------+---------+------------+
| testFK | ordinal | questionFK |
+--------+---------+------------+
|      2 |       1 |         14 |
|      2 |       2 |         15 |
|      2 |       3 |         16 |
|      2 |       4 |         17 |
+--------+---------+------------+

或者,您可以按照以下方式做一些事情(简化)-但我永远不会认真倡导这种解决方案:

INSERT INTO my_table (testFK,questionFK,ordinal) 
SELECT 2,18,MAX(ordinal+1) FROM my_table;

SELECT * FROM my_table;
+--------+---------+------------+
| testFK | ordinal | questionFK |
+--------+---------+------------+
|      2 |       1 |         14 |
|      2 |       2 |         15 |
|      2 |       3 |         16 |
|      2 |       4 |         17 |
|      2 |       5 |         18 |
+--------+---------+------------+

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL语句中的PHP变量不起作用

来自分类Dev

PHP准备语句中的问号不起作用?

来自分类Dev

变量调用在sql语句中不起作用

来自分类Dev

简单的带占位符的预准备语句不起作用

来自分类Dev

经典ASP预准备语句SELECT不起作用

来自分类Dev

我的SQL准备语句不起作用

来自分类Dev

PHP MySQLi准备的语句不起作用

来自分类Dev

PHP MySQLi准备的语句不起作用

来自分类Dev

变量在If语句中不起作用

来自分类Dev

PHP $ stmt-> num_rows在准备好的语句中不起作用

来自分类Dev

Microsoft SQL Case 语句在 Order By 语句中不起作用

来自分类Dev

'<'在if语句中不起作用

来自分类Dev

PHP准备好的语句不起作用

来自分类Dev

PHP准备好的语句不起作用

来自分类Dev

使用Variable限制在SQL语句中不起作用

来自分类Dev

使用Variable限制在SQL语句中不起作用

来自分类Dev

max语句中的SQL多个条件不起作用

来自分类Dev

在嵌套的IF语句中时,PHP重定向不起作用

来自分类Dev

或“ ||”运算符在php中的if语句中不起作用

来自分类Dev

准备好的语句不起作用

来自分类Dev

Mysqli准备的语句不起作用

来自分类Dev

JDBC准备语句不起作用

来自分类Dev

Mysqli准备的语句选择不起作用

来自分类Dev

准备好的语句不起作用

来自分类Dev

准备好的语句不起作用

来自分类Dev

我的 MySQL 准备语句不起作用

来自分类Dev

PHP更新SQL语句不起作用

来自分类Dev

PHP SQL语句不起作用

来自分类Dev

PHP更新SQL语句不起作用