/** * @see parent::cleanupSQL() * * @param string $sql * @param array $params * @param Criteria $values * @param DatabaseMap $dbMap */ public function cleanupSQL(&$sql, array &$params, Criteria $values, DatabaseMap $dbMap) { $i = 1; foreach ($params as $param) { $tableName = $param['table']; $columnName = $param['column']; $value = $param['value']; // this is to workaround for a bug with pdo_sqlsrv inserting or updating blobs with null values // http://social.msdn.microsoft.com/Forums/en-US/sqldriverforphp/thread/5a755bdd-41e9-45cb-9166-c9da4475bb94 if (null !== $tableName) { $cMap = $dbMap->getTable($tableName)->getColumn($columnName); if (null === $value && $cMap->isLob()) { $sql = str_replace(":p{$i}", "CONVERT(VARBINARY(MAX), :p{$i})", $sql); } } $i++; } }
/** * Binds values in a prepared statement. * * This method is designed to work with the Criteria::createSelectSql() method, which creates * both the SELECT SQL statement and populates a passed-in array of parameter * values that should be substituted. * * <code> * $adapter = Propel::getServiceContainer()->getAdapter($criteria->getDbName()); * $sql = $criteria->createSelectSql($params); * $stmt = $con->prepare($sql); * $params = array(); * $adapter->populateStmtValues($stmt, $params, Propel::getServiceContainer()->getDatabaseMap($critera->getDbName())); * $stmt->execute(); * </code> * * @param StatementInterface $stmt * @param array $params array('column' => ..., 'table' => ..., 'value' => ...) * @param DatabaseMap $dbMap */ public function bindValues(StatementInterface $stmt, array $params, DatabaseMap $dbMap) { $position = 0; foreach ($params as $param) { $position++; $parameter = ':p' . $position; $value = $param['value']; if (null === $value) { $stmt->bindValue($parameter, null, \PDO::PARAM_NULL); continue; } $tableName = $param['table']; if (null === $tableName) { $type = isset($param['type']) ? $param['type'] : \PDO::PARAM_STR; $stmt->bindValue($parameter, $value, $type); continue; } $cMap = $dbMap->getTable($tableName)->getColumn($param['column']); $this->bindValue($stmt, $parameter, $value, $cMap, $position); } }
/** * @see parent::cleanupSQL() * * @param string $sql * @param array $params * @param Criteria $values * @param DatabaseMap $dbMap */ public function cleanupSQL(&$sql, array &$params, Criteria $values, DatabaseMap $dbMap) { $i = 1; $paramCols = []; foreach ($params as $param) { if (null !== $param['table']) { $column = $dbMap->getTable($param['table'])->getColumn($param['column']); /* MSSQL pdo_dblib and pdo_mssql blob values must be converted to hex and then the hex added * to the query string directly. If it goes through PDOStatement::bindValue quotes will cause * an error with the insert or update. */ if (is_resource($param['value']) && $column->isLob()) { // we always need to make sure that the stream is rewound, otherwise nothing will // get written to database. rewind($param['value']); $hexArr = unpack('H*hex', stream_get_contents($param['value'])); $sql = str_replace(":p{$i}", '0x' . $hexArr['hex'], $sql); unset($hexArr); fclose($param['value']); } else { $paramCols[] = $param; } } $i++; } // if we made changes re-number the params if ($params != $paramCols) { $params = $paramCols; unset($paramCols); preg_match_all('/:p\\d/', $sql, $matches); foreach ($matches[0] as $key => $match) { $sql = str_replace($match, ':p' . ($key + 1), $sql); } } }