Данные вообще не вводятся в базу данных?

У меня странная проблема с проектом, над которым я сейчас работаю. Весь код работает без ошибок, но значения не вводятся в базу данных с помощью инструкции INSERT.

Код выглядит следующим образом:

pipe.php (файл, вызывающий запрос):

#!/usr/bin/php
<!--?php

require_once 'includes/Init.php';

Init::initialise();

$email = file_get_contents('php://stdin');
$db = new Db($config['db']);

$mail = new Mail($email);

$emailbody = $mail--->getPlainBody();
$emailsubject = $mail->getSubject();
$from = $mail->getHeader("From");
$to = $mail->getTo();

if ($id = Util::getId($emailsubject))
{

 $ticket = $db->query_assoc("SELECT * FROM tickets WHERE ticket_id=$id");

 if (in_array($from, $config['staff_emails']))
 {
 //staff reply

 $tickets = $ticket['content'].="<ticketsep>$emailbody";

 $db->query("UPDATE tickets SET content=$tickets WHERE ticket_id=$id");

 mail($ticket['email'], "[$id] A member of staff replied to your ticket: ".$ticket['subject'], $emailbody);
 }
 else
 {
 //client reply

 $tickets = $ticket['content'].="<ticketsep>$emailbody";

 $db->query("UPDATE tickets SET content=$tickets WHERE ticket_id=$id");

 foreach ($config['staff_emails'] as $email)
 {
 mail($email, "[$id] [CLIENT RESPONSE] $emailsubject", $emailbody);
 }
 }

}
else
{
 do
 {
 $id = rand(1000000, 9999999);

 if (!Util::in_array_r($id, $db->query_all('SELECT * FROM tickets')))
 {
 break;
 }
 }
 while (true);

 $db->query("INSERT INTO tickets VALUES \($id, $emailsubject, $emailbody, $from\)");


 foreach ($config['staff_emails'] as $email)
 {
 mail($email, "[$id] [NEW TICKET] $emailsubject", $emailbody);
 }
}
?>
</ticketsep></ticketsep>

Эта строка не работает, данные не вставлены: $db->query("INSERT INTO tickets VALUES \($id, $emailsubject, $emailbody, $from\)"); , Я не могу проверить другой запрос на вставку, поскольку нет данных уже;)

Класс Db выглядит так (без комментариев о стиле кода, пожалуйста, большинство из них работает: P):

<!--?php

class Db
{

 private $link;

 /**
 * Constructor.
 * @param array $dbconfig Array of database configuration:
 *
 * host - database host
 * user - database user
 * password - database user password
 * dbname - database name
 * port - database server port
 */
 public function __construct(array $dbconfig)
 {
 $this--->link = mysqli_connect($dbconfig['host'], $dbconfig['user'], $dbconfig['password'], $dbconfig['dbname'], $dbconfig['port']);

 if (!$this->link)
 {
 throw new DatabaseException("Unable to connect to database, please check the settings in the config.php file!");
 }

 }

 /**
 * Query the database
 * @param string $query SQL query to run
 * @return mysqli_result
 */
 public function query($query)
 {
 $result = mysqli_query($this->link, $query);
 $this->checkError();
 return $result;
 }

 /**
 * Gets the first row of a query.
 * @param string $query SQL query
 * @return array Enumeriated array of first row contents.
 */
 public function query_first($query)
 {
 $result = mysqli_fetch_row($this->query($query));
 $this->checkError();
 return $result;
 }

 /**
 * Gets the first row of a query as an associative array
 * @param string $query SQL Query
 * @return array Associative array of row. Column name->column value.
 */
 public function query_assoc($query)
 {
 $result = mysqli_fetch_assoc($this->query($query));
 $this->checkError();
 return $result;
 }

 /**
 * Gets all results as array.
 * @param unknown $query
 * @param string $resulttype
 * @return array
 */
 public function query_all($query)
 {

 if (function_exists('mysqli_fetch_all')) # Compatibility layer with PHP < 5.3
 $res = mysqli_fetch_all($this->query($query));
 else
 for ($res = array(); $tmp = mysqli_fetch_array($this->query($query));) $res[] = $tmp;

 return $res;
 }

 public function checkError()
 {
 if ($this->error != '')
 {
 throw new DatabaseException("Database Error(s) Occured: $this->error");
 }
 }

 /**
 * Get this instance of this object.
 * @return Db
 */
 public static function _getInstance()
 {
 return $this;
 }

 public function __get($name)
 {
 switch ($name) {
 case "error":
 $this->error = mysqli_error($this->link);
 break;
 }
 }
}

Все остальные строки кода в run.php запускаются, поскольку я получаю письмо, однако данные не добавляются в базу данных. Кто-нибудь знает, почему, и если да, то как я могу сделать так, чтобы данные вставили?

2 ответа

Вы должны использовать одиночную кавычку и метод mysql_real_escape_string если вы хотите, чтобы эти кавычки были экранированы в данных. Вот пример:

$emailbody = mysql_real_escape_string($mail->getPlainBody());
$emailsubject = mysql_real_escape_string($mail->getSubject());
$from = mysql_real_escape_string($mail->getHeader("From"));

$db->query("INSERT INTO tickets VALUES ($id, '$emailsubject', '$emailbody', '$from')");

Из документации PHP:

mysql_real_escape_string - Escapes специальные символы в строке для использования в инструкции SQL


Вам нужно добавить простые кавычки именам переменных: ticket_id = '$id'.

licensed under cc by-sa 3.0 with attribution.