在PHP中的Prepared语句中设置SQL变量不起作用

时间:2016-01-27 09:42:52

标签: php mysql sql

情况:我有一个包含questionFKordinal testFK | questionFK | ordinal 2 14 1 2 15 2 2 16 3 _____________________________ NEW 2 17 4 列的联结表。

testFK = 2

我想使用questionFK = 17ordinal向表中添加新行,但是,我希望根据表中已有的内容自动生成SQL。由于最高序数为3,因此我希望$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; } 自动生成4.

我试过了:

ordinal

如果我对SQL进行硬编码,这是有效的,但我似乎无法让Fatal error: Call to a member function bind_param() on a non-object in \classes\Test.php on line 91 自己做。{/ p>

非常感谢任何输入!

更新 我得到的错误

SQL

所以我假设{{1}}不正确。

3 个答案:

答案 0 :(得分:3)

在OP最近的评论中,下面提出的解决方案并不恰当。

如果您使用MyISAM表类型并定义自动增量列为第二个的主键,则MyISAM automatically calculates按第一个字段分组的增量(请参阅链接文档中的MyISAM注释):< / p>

  

对于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 |
+--------+---------+------------+

答案 1 :(得分:1)

试试这个:

INSERT INTO junc_test_question (testFK, questionFK, ordinal)
VALUES (2, 17, (select * from (select ordinal+1 from junc_test_question order by ordinal desc limit 1) as p) );

对于下一个序数查询同一个表的最大值,并为其添加1。

答案 2 :(得分:0)

INSERT INTO junc_test_question (testFK, questionFK, ordinal)
VALUES (?, ?, (
  select MAX(ordinal)+1 from  (select * from junc_test_question ) as rftable where testFK=?
) );

这是我的答案。