Я строю модуль SugarCRm. Он использует старые основные функции MySQL, как PHP4 дней …
Большинство модулей в системе обращаются к классу-оболочке базы данных, вызывая эту глобальную переменную и затем используя ее.
global $db;
$db->quote($some_SQL_Query_To_Execute);
Теперь я не большой поклонник этого, поэтому в моих собственных классах Module в моем методе Constructor я делаю это …
class MyModuleClassHereForSODemo
{
public $db;
public function __cnstructor($id){
$this->db = DBManagerFactory::getInstance();
}public function insertDBRecordFunctionHERE($id){
$sql = "INSERT INTO `db_table_name` (
`topic_id`,
`project_id`,
`topic_subject`,
`topic_content`,
`date_created`,
`date_last_post`,
`created_by_user_id`,
`last_post_user_id`,
`posts_replies`
) VALUES(
NULL,
'$this->db->quote($project_id)',
'$this->db->quote($topic_subject)',
'$this->db->quote($topic_content)',
UTC_TIMESTAMP(),
UTC_TIMESTAMP(),
'$this->db->quote($created_by_user_id)',
'$this->db->quote($created_by_user_id)',
'0');";
$this->db->query($sql);
}}
Теперь вот проблема у меня, этот запрос SQL выше не будет работать, потому что я звоню $this->db->quote()
на мои переменные … теперь, что очень странно и разочаровывает, если я вместо этого использую переменную GLOBAL $ db, то я могу запустить это вместо $db->quote()
и это работает весь день … это, как только я запускаю quote()
метод в моих собственных свойствах $ db классов, что он ломает все.
Может ли это быть из-за того, что система рассматривает их как различные соединения с БД, даже если она синглтонна и должна представлять собой одну и ту же переменную и объект, которые я представляю … какие-то идеи?
Также у меня нет всего кода для класса DB, к которому я обращаюсь, но я знаю, что quote
метод просто вызывает mysql_real_escape_string
Довольно поздно на вечеринку здесь, но проблема не в том, что у вас есть местный $db
переменная. Дело в том, что синтаксический анализ строки не подхватит использование функций в вашей строке. Вместо этого вы должны использовать сложный синтаксис.
То есть
$string = "This is a string with a function call'{$this->db->quote($project_id)}'";
Увидеть https://php.net/manual/en/language.types.string.php#language.types.string.parsing
Других решений пока нет …