我有一个包含数据的表和一个名为'周'的列。每当用户向数据库发布内容时,都会将其添加到“周”列中:
$week = Date('W');
所以在本周插入的所有内容都有数字' 13'在周列。现在我想要一个查询,从本周选择所有内容并在我的网站上发布,所以我写了一个像上面那样的变量并写道:
$sql = 'SELECT * FROM my_table WHERE week = $week';
但它回复了一个错误:Unknown column '$week' in 'where clause'.
如果我写SELECT * FROM my_table WHERE week = 13;
,它可以正常工作,但我希望它能自动选择当前周数。
答案 0 :(得分:4)
为什么不简单地做
$sql = "SELECT * FROM my_table WHERE week = WEEK(NOW())";
只需注意:SELECT *
不是很好,也是非常糟糕的做法。只选择你需要的东西。
答案 1 :(得分:1)
你必须使用双引号作为字符串:
$sql = "SELECT * FROM my_table WHERE week = $week";
如果没有,$周不会被替换。
您应该使用预准备语句来阻止SQL注入。
答案 2 :(得分:0)
注意SQL注入和 改变这个
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
Container cont = frame.getContentPane();
cont.setLayout(new BorderLayout());
DefaultTableModel dtm = new DefaultTableModel(new Object[]{"Column 1","Column 2"}, 0);
JTable table = new JTable(dtm);
JScrollPane scroll = new JScrollPane(table);
cont.add(scroll, BorderLayout.CENTER);
dtm.addRow(new Object[]{"Value 1", "Value 2"});
JButton add = new JButton("Add");
cont.add(add, BorderLayout.NORTH);
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dtm.addRow(new Object[]{"Another value", "Another value"});
}
});
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
在
$sql = 'SELECT * FROM my_table WHERE week = $week';
答案 3 :(得分:0)
请使用它,它比SQL注入更安全:
$week = $mysqli->escape_string($week);
$sql = "SELECT * FROM my_table WHERE week = '" . $week . "'";
$retval = $mysqli->query($sql);
您需要将mysqli对象设置为与数据库的连接才能使其正常工作。之后,您可以从$ retval中获取行。
答案 4 :(得分:0)
假设您的日期列是实际的MySQL日期列:
SELECT * FROM my_table WHERE date > DATE_SUB(NOW(), INTERVAL 1 WEEK);