if ($charset) {
$connect .= ";charset=" . $charset;
}
-
- if ($socket) {
- $connect .= ";$unix_socket=" . $socket;
- }
-
- try {
+
+ if ($socket) {
+ $connect .= ";$unix_socket=" . $socket;
+ }
+
+ try {
$this->connection = @new PDO($connect, $user, $pass, [PDO::ATTR_PERSISTENT => $persistent]);
$this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->pdo_emulate_prepares);
$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
if ($charset) {
$this->connection->set_charset($charset);
}
-
- if ($socket) {
- $this->connection->set_socket($socket);
- }
+
+ if ($socket) {
+ $this->connection->set_socket($socket);
+ }
}
}
*
* @return boolean Was the command executed successfully?
*/
- public function transaction()
+ public function transaction(): bool
{
if (!$this->performCommit()) {
return false;
* @param array $fields contains the fields that are updated
* @param array $condition condition array with the key values
* @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate, false = don't update identical fields)
+ * @param array $params Parameters: "ignore" If set to "true" then the update is done with the ignore parameter
*
* @return boolean was the update successfull?
* @throws \Exception
*/
- public function update($table, $fields, $condition, $old_fields = [])
+ public function update($table, $fields, $condition, $old_fields = [], $params = [])
{
if (empty($table) || empty($fields) || empty($condition)) {
$this->logger->info('Table, fields and condition have to be set');
$condition_string = DBA::buildCondition($condition);
- $sql = "UPDATE " . $table_string . " SET "
+ if (!empty($params['ignore'])) {
+ $ignore = 'IGNORE ';
+ } else {
+ $ignore = '';
+ }
+
+ $sql = "UPDATE " . $ignore . $table_string . " SET "
. implode(" = ?, ", array_map([DBA::class, 'quoteIdentifier'], array_keys($fields))) . " = ?"
. $condition_string;
{
array_walk($arr, [$this, 'escapeArrayCallback'], $add_quotation);
}
+
+ /**
+ * Replaces a string in the provided fields of the provided table
+ *
+ * @param string $table_name
+ * @param array $fields List of field names in the provided table
+ * @param string $search
+ * @param string $replace
+ * @throws \Exception
+ */
+ public function replaceInTableFields(string $table_name, array $fields, string $search, string $replace)
+ {
+ $search = $this->escape($search);
+ $replace = $this->escape($replace);
+
+ $upd = [];
+ foreach ($fields as $field) {
+ $field = DBA::quoteIdentifier($field);
+ $upd[] = "$field = REPLACE($field, '$search', '$replace')";
+ }
+
+ $upds = implode(', ', $upd);
+
+ $r = $this->e(sprintf("UPDATE %s SET %s;", $table_name, $upds));
+ if (!$this->isResult($r)) {
+ throw new \RuntimeException("Failed updating `$table_name`: " . $this->errorMessage());
+ }
+ }
}