在mysql php7中使用变量创建查询?

在mysql php7中使用变量创建查询?,php,mysql,pdo,Php,Mysql,Pdo,我正在尝试创建一个查询,但它不起作用。 我错在哪里 $date = new \Datetime(date('d-m-Y')); $date->add(DateInterval::createFromDateString('- 2 day')); $date = $date->format('Y-m-d'); $stmt = $pdo->prepare('SELECT company.id as id, email, first_name, last_name, slug FR

我正在尝试创建一个查询,但它不起作用。 我错在哪里

$date = new \Datetime(date('d-m-Y'));
$date->add(DateInterval::createFromDateString('- 2 day'));
$date = $date->format('Y-m-d');

$stmt = $pdo->prepare('SELECT company.id as id, email, first_name, last_name, slug FROM company WHERE created < $date AND reminder = 0');

$stmt->execute();
$result = $stmt->fetchAll();

您需要在SQL查询中使用连接运算符。

像这样

$stmt = $pdo->prepare('SELECT company.id as id, email, first_name, last_name, slug FROM company WHERE created < "' . $date . '" AND reminder = 0'); 
编辑->积分转到@SheperdOfFire:

$date = new \Datetime(date('d-m-Y'));
$date->add(DateInterval::createFromDateString('- 2 day'));
$date = $date->format('Y-m-d');

$stmt = $pdo->prepare('SELECT company.id as id, email, first_name, last_name, slug FROM company WHERE created < :date AND reminder = 0');
$stmt->bindParam(':date', $date);

$stmt->execute();
$result = $stmt->fetchAll();

执行此操作的正确方法未经测试:

$date = new \Datetime(date('d-m-Y'));
$date->add(DateInterval::createFromDateString('- 2 day'));
$date = $date->format('Y-m-d');

$stmt = $pdo->prepare('SELECT company.id as id, email, first_name, last_name, slug FROM company WHERE created < :date AND reminder = 0');
$stmt->bindParam(':date', $date);

$stmt->execute();
$result = $stmt->fetchAll();
确保将变量绑定到查询,而不是直接将数据插入查询,这被认为是不安全的。
有关这方面的更多信息,请参见

查询失败的原因是您试图在使用撇号创建的字符串中引用变量,这仅适用于双引号

$myvar = 1234;
$q1 = 'myvar = $myvar'; // myvar = $myvar
$q2 = "myvar = $myvar"; // myvar = 1234
您还应该在中准备查询properlyas


通过使用这样的预处理语句,可以防止SQL注入,因为查询的解析方式不同。

您可能应该使用双引号。除此之外,请准备好您的声明,而不要相信您的数据是mysql安全的。您是否尝试过检查您得到的错误并了解发生了什么?您的意图是使用日期变量的值,但您已将其作为SQL文本的一部分嵌入。它可以工作,但由于可能的mysql注入,被认为是不安全的:在执行查询之前使变量mysql安全并不难。@Sheperdoffie是的,您是对的!你的答案是正确的,你可以把它标记为正确的答案,这样其他看这个话题的人就可以把它看作是正确的well@azertyseven那么你应该把它标记为正确的
$date = new \Datetime(date('d-m-Y'));
$date->add(DateInterval::createFromDateString('- 2 day'));
$date = $date->format('Y-m-d');

$stmt = $pdo->prepare("SELECT company.id as id, email, first_name, last_name, slug FROM company WHERE created < :date AND reminder = :reminder");

$stmt->execute([':date' => $date, ':reminder' => 0]);
$result = $stmt->fetchAll();