PHP calling MYSQL statement and getting output

I am trying to call via php an MySQL Statement and have that output the values. Below is what I have tried. Could someone please help enlighten me as to what I am doing wrong?

<?php
$sql = "SELECT DAYNAME(wp_cbxrbooking_log_manager.`booking_date`) as 'weekday',  n"

    . "              wp_cbxrbooking_log_manager.`party_size` as 'Party Size',n"

    . "              wp_cbxrbooking_log_manager.`booking_time` as 'Time',n"

    . "              wp_cbxrbooking_log_manager.`mattiscool` as '# of Reservations'n"

    . "FROM wp_cbxrbooking_log_managern"

    . "n"

    . "WHERE `booking_date` >= DATE(NOW()) - INTERVAL 7 DAY  n"

    . "ORDER BY `Time`  ASC";
?>

index – How can I enforce that my composite key columns do not equal one another in MySQL?

I have a pivot table in which there is a composite key made up of two columns that reference the same table. The columns are requester_id and addressee_id and both of them refer to the id field on a users table. I’m trying to make sure that something like this cannot happen:

requester_id   addressee_id   created_at
1              1              2020-08-09 18:40:23

I’ve also added an index expression to ensure that there can only be one unique pairing of IDs as well:

alter table `user_relationships` 
add unique index `unique_relationships_index`
((least(requester_id,addressee_id)), (greatest(requester_id,addressee_id)))

To avoid having 1|2 and 2|1.

mysql – Como hago para que no me elimine todos los registros mediante este procedimiento de almacenado?

No utilices como nombre del parámetro de entrada el mismo nombre del campo, pues se crea ambigüedad entre los nombres. En realidad, tu query está comparando siempre que el parámetro de entrada sea igual a si mismo, condición que van a cumplir todas las filas de la tabla.

Podrías resolverlo calificando los nombres, pero es muy sencillo y más fácil de comprender, como te he dicho, evitar la colisión entre los nombres:

CREATE PROCEDURE EliminarInstructor(
    in pIdInstructor INT
)
BEGIN
  DELETE FROM instructor WHERE id_Instructor = pIdInstructor;
END

Como ya te había dicho, puedes calificar el nombre, así:

CREATE PROCEDURE EliminarInstructor(
    in Id_Instructor INT
)
BEGIN
  DELETE FROM instructor WHERE instructor.id_Instructor = Id_Instructor;
END

mysql – Transfer rows into a new table, forcing to generate unique primary keys till its insertable

Lets say we have the following scenario…

+-----------------+-------------+---------------+
| Table           | PK          | Additional    |
+-----------------+-------------+---------------+
| playerinventory | id (int)    | amount, level |
+-----------------+-------------+---------------+
| newinventory    | id (BIGINT) | amount, level |
+-----------------+-------------+---------------+

We are in the middle of a architectural change of our game-database.
“amount, level” should get extracted from “playerinventory” and get inserted into “newinventory”.

Limitations

  • “newinventory” has no auto-increment pk, therefore we need to
    generate a unique long for each… we also can not add
    “auto-increment” to the table
  • “newinventory” could possible
    already contain those identities, so we need to check if the
    generated id already exists and if so repeat the process for the
    affected set of extracted columns till it was inserted
    sucessfully.
  • We CANT simply insert each row from
    “playerinventory” into “newinventory” with its current id… thats
    simply not possible ( if i would explain why this post would be much,
    much longer ), thats why we NEED to generate a new unique
    ID

In nearly any programming language this process would look like this

for row in playerInventory
   id = generate new ID
   while(id in newInventory) id = generate new ID
   insert into newInventory( id, row.amount, row.level )
      

How can we achieve this in MySQL/SQL ?

shutdown – Mysql randomly restarts with different args?

I’m facing a rather strange problem and I’m not sure how to make sense of it.
It looks like the mysqld process is being started with different args by something other than systemd after the mysql systemd service is already running. This causes the mysql server to go down and the new process to become unresponsive.

When started through systemd:
/usr/sbin/mysqld

When started by ?
mysqld --user=mysql --init-file=/var/lib/mysql-files/tmp.Ld6xyAe3qb --socket=/tmp/tmp.obBArlPCj2/mysqld.sock --pid-file=/tmp/tmp.obBArlPCj2/mysqld.pid

It is unclear why mysql is being restarted, by who, and where the new arguments are coming from.

/var/lib/mysql-files/tmp.Ld6xyAe3qb (which is the init-file supplied above) contains the following text:

USE mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH 'auth_socket';
SHUTDOWN;

The only thing I can see in the logs is:

2020-08-08T06:57:31.123013Z 0 (System) (MY-013172) (Server) Received SHUTDOWN from user <via user signal>. Shutting down mysqld (Version: 8.0.21-0ubuntu0.20.04.4).

... (group replication, InnoDB, normal logs) ...

2020-08-08T06:57:49.954754Z 8 (System) (MY-013172) (Server) Received SHUTDOWN from user boot. Shutting down mysqld (Version: 8.0.21-0ubuntu0.20.04.4).

The first log occurs randomly; there is nothing before it that indicates a memory or any other kind of error (that I can see). The second shutdown seems to come from the init-file. However, the more confusing aspect is that there is no user boot on the system or in mysql. Additionally, the latter mysqld process (with args) continues to run despite what looks to be a clean shutdown in the logs. This prevents mysql from being restarted, as ./ibdata1 is still locked.

The only service using mysql is OpenStack Keystone for the purpose of Swift object-store and no other OpenStack services.

As far as I can tell, there is no other cron or systemd service that references mysql but I’m not positive on that test. The command was:
systemctl list-units --all --no-legend | awk '{print $1}' | xargs -n1 systemctl cat 2>/dev/null | grep mysql
which gives:

After=postgresql.service mysql.service keystone.service rabbitmq-server.service ntp.service network-online.target local-fs.target remote-fs.target 
# /lib/systemd/system/mysql.service
User=mysql
Group=mysql
PIDFile=/run/mysqld/mysqld.pid
ExecStartPre=/usr/share/mysql/mysql-systemd-start pre
ExecStart=/usr/sbin/mysqld
RuntimeDirectory=mysqld

The first line is from /lib/systemd/system/cinder-volume.service, which needs to be removed but I do not believe to be related to this issue, as the problem occurs on servers that never had cinder installed

This problem occurs on 4 servers set up for group replication.

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04 LTS
Release:    20.04
Codename:   focal
# mysql --version
mysql  Ver 8.0.21-0ubuntu0.20.04.4 for Linux on x86_64 ((Ubuntu))
# cat /etc/mysql/mysql.conf.d/mysqld.cnf 
#
# The MySQL database server configuration file.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

(mysqld)

log-error-verbosity = 5

#
# * Basic Settings
#
user        = mysql
# pid-file  = /var/run/mysqld/mysqld.pid
# socket    = /var/run/mysqld/mysqld.sock
# port      = 3306
# datadir   = /var/lib/mysql


# If MySQL is running as a replication slave, this should be
# changed. Ref https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmpdir
# tmpdir        = /tmp
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address        = 0.0.0.0
#
# * Fine Tuning
#
key_buffer_size     = 16M
# max_allowed_packet    = 64M
# thread_stack      = 256K

# thread_cache_size       = -1

# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover-options  = BACKUP

# max_connections        = 151

# table_open_cache       = 4000

#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
#
# Log all queries
# Be aware that this log type is a performance killer.
# general_log_file        = /var/log/mysql/query.log
# general_log             = 1
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
#
# Here you can see queries with especially long duration
# slow_query_log        = 1
# slow_query_log_file   = /var/log/mysql/mysql-slow.log
# long_query_time = 2
# log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
# server-id     = 1
# log_bin           = /var/log/mysql/mysql-bin.log
# binlog_expire_logs_seconds    = 2592000
max_binlog_size   = 100M
# binlog_do_db      = include_database_name
# binlog_ignore_db  = include_database_name

# disable non innodb storage engines for group replication
# https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-instances.html
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

# use native password auth
default_authentication_plugin=mysql_native_password

# replication framework settings
server_id = 1
gtid_mode = ON
enforce_gtid_consistency = ON
log_bin = binlog
log_slave_updates = ON
binlog_format = ROW
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE

# group replication settings
plugin_load_add = 'group_replication.so'
plugin-load-add = 'mysql_clone.so'
group_replication_group_name = "xxx"
group_replication_start_on_boot = on
group_replication_local_address = "xxx:33061"
group_replication_ip_whitelist="xxx"
group_replication_group_seeds = "xxx:33061"
group_replication_bootstrap_group = off
group_replication_enforce_update_everywhere_checks = off
group_replication_single_primary_mode = off

## tls
# required encrypted remote connections
# require_secure_transport = ON

tls_version=TLSv1.3
ssl_ca = "/etc/mysql/certs/eons.dev.pem"
ssl_cert = "/etc/mysql/certs/skyrim-mysql.pem"
ssl_key = "/etc/mysql/certs/skyrim-mysql.key"
ssl_cipher = "DHE-RSA-AES256-SHA"
##ssl_crl = "crl-server-revoked.crl"
##ssl_crlpath = "/.../crl_directory"
mysqlx_ssl_ca = "/etc/mysql/certs/eons.dev.pem"
mysqlx_ssl_cert = "/etc/mysql/certs/skyrim-mysql.pem"
mysqlx_ssl_key = "/etc/mysql/certs/skyrim-mysql.key"
mysqlx_ssl_cipher = "DHE-RSA-AES256-SHA"

# group replication tls
group_replication_ssl_mode = REQUIRED
group_replication_recovery_use_ssl = on
group_replication_recovery_ssl_ca = "/etc/mysql/certs/eons.dev.pem"
group_replication_recovery_ssl_cert = "/etc/mysql/certs/skyrim-mysql.pem"
group_replication_recovery_ssl_key = "/etc/mysql/certs/skyrim-mysql.key"
group_replication_recovery_ssl_cipher = "DHE-RSA-AES256-SHA"

mysql – Trecho de código PHP de reposição de produtos comprados está repondo mais que o necessário

O código em questão deve calcular a venda e atualizar sua quantidade de produtos da tabela itens_venda para que seja reposta na tabela produto:

Qual é o erro do código: Está fazendo uma errada reposição da quantidade de produtos disponíveis na tabela produto (está repondo a mais que o necessário).

A linha com uma má lógica é o IF que está causando o erro de reposição da quantidade de produtos:

// IF que atualiza a coluna quantidade de um produto da tabela produto
   if ($quantidade >= 1) {
        // Definida como devolução
        $atualiza_quantidade = "UPDATE produto SET quantidade = quantidade + :quantidade
        WHERE cd_produto = :cd_produto";
    }else{
        // Definido como retirada
        $atualiza_quantidade = "UPDATE produto SET quantidade = quantidade - :quantidade
        WHERE cd_produto = :cd_produto";
    }
-- Código das tabelas

CREATE TABLE produto (
  cd_produto INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  nome VARCHAR(30),
  marca VARCHAR(30),
  codigo_barra VARCHAR(15),
  cor VARCHAR(30),
  tamanho VARCHAR(2),
  CHECK (tamanho IN ('P','M','G','GG')),
  genero CHAR(1),
  CHECK (genero IN ('M','F')),
  quantidade INT,
  valor_compra DECIMAL(7,2),
  valor_revenda DECIMAL(7,2)
);

CREATE TABLE itens_venda (
  cd_itens_venda INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  cd_produto INT,
  cd_funcionario INT,
  cd_cliente INT,
  tipo_pagamento VARCHAR(30),
  CHECK (tipo_pagamento IN ('Pagamento á vista')),
  valor_item DECIMAL(7,2),
  quantidade INT,
  valor_total DECIMAL(7,2),
  data_venda TIMESTAMP(0),
  FOREIGN KEY (cd_produto) REFERENCES produto (cd_produto),
  FOREIGN KEY (cd_funcionario) REFERENCES funcionario (cd_funcionario),
  FOREIGN KEY (cd_cliente) REFERENCES cliente (cd_cliente)
  ON DELETE CASCADE
  ON UPDATE CASCADE
);
// Código PHP
<?php
    // Inclusão do arquivo conexao.php ao update_venda.php
    require_once '../conexao/conexao.php'; 
    // Se existir o botão de Atualizar
    if(isset($_POST('Atualizar'))){
        // Especifica a variável
        $cd_itens_venda = $_POST('cd_itens_venda');
        $cd_produto = $_POST('cd_produto');
        $cd_funcionario = $_POST('cd_funcionario');
        $cd_cliente = $_POST('cd_cliente');
        $tipo_pagamento = $_POST('tipo_pagamento');
        $valor_item = $_POST('valor_item');
        $quantidade = $_POST('quantidade');
        // Cálcula o valor total da compra multiplicando o valor com a quantidade
        $valor_total = ($valor_item * $quantidade);
        // Se a atualização for possível de realizar
        try {
            // Método que inicializa a(s) transação(ões)
            $conexao->beginTransaction();
            // Query que faz a atualização
            $atualizacao = "UPDATE itens_venda SET cd_produto = :cd_produto, 
            cd_funcionario = :cd_funcionario, cd_cliente = :cd_cliente, 
            tipo_pagamento = :tipo_pagamento, valor_item = :valor_item, 
            quantidade = :quantidade, valor_total = :valor_total WHERE cd_itens_venda = :cd_itens_venda";
            // $atualiza_dados recebe $conexao que prepare a operação de atualização
            $atualiza_dados = $conexao->prepare($atualizacao);
            // Vincula um valor a um parâmetro
            $atualiza_dados->bindValue(':cd_itens_venda',$cd_itens_venda);
            $atualiza_dados->bindValue(':cd_produto',$cd_produto);
            $atualiza_dados->bindValue(':cd_funcionario',$cd_funcionario);
            $atualiza_dados->bindValue(':cd_cliente',$cd_cliente);
            $atualiza_dados->bindValue(':tipo_pagamento',$tipo_pagamento);
            $atualiza_dados->bindValue(':valor_item',$valor_item);
            $atualiza_dados->bindValue(':quantidade',$quantidade);
            $atualiza_dados->bindValue(':valor_total',$valor_total);
            // Executa a operação
            $atualiza_dados->execute();
            // IF que atualiza a coluna quantidade de um produto da tabela produto
            if ($quantidade >= 1) {
                // Definida como devolução
                $atualiza_quantidade = "UPDATE produto SET quantidade = quantidade + :quantidade
                WHERE cd_produto = :cd_produto";
            }else{
                // Definido como retirada
                $atualiza_quantidade = "UPDATE produto SET quantidade = quantidade - :quantidade
                WHERE cd_produto = :cd_produto";
            }
            // $quantidade_produto recebe $conexao que prepara a transação para atualiza o estoque na tabela produto
            $quantidade_produto = $conexao->prepare($atualiza_quantidade);
            // Vincula um valor a um parâmetro da tabela produto
            $quantidade_produto->bindValue(':cd_produto',$cd_produto);
            $quantidade_produto->bindValue(':quantidade',$quantidade);
            // Executa a operação
            $quantidade_produto->execute();
            // Confirma a execução das query's em todas as transações  
            $conexao->commit();
            // Se a atualização não for possível de realizar
        } catch (PDOException $falha_atualizacao) {
            $desfazer->rollback(); // Desfaz qualquer alteração dentro da transação
            echo "A atualização não foi feita".$falha_atualizacao->getMessage();
        }
    }   
?>

mysql – Ajuda com trigger para valor duplicado

Tenho um banco de dados de controle de entrada, e preciso fazer uma modificação para conter um número único na planilha, seria algo assim:

Tabela: id, nome, data, cracha;

Preciso que o valor do campo cracha seja único, só ate o valor ser duplicado, ou seja, vamos supor que um registro receba o crachá 10, quando mais tarde eu inserir o numero 10 em um novo registro, ou até mesmo atualizar um registro antigo, o numero ja existente na planilha deixa de existir, ficando um branco, portanto:

ID – NOME – DATA – CRACHA
4 – JOAO – 08/08/2020 15:00 – 10
8 – PEDRO – 08/08/2020 15:50 – 10

Neste momento do novo registro, ou atualização, do ID 8 – PEDRO, automaticamente o ID 4 – JOÃO, ficará com o campo cracha em branco.

Tentei algo com o TRIGGER abaixo, mas não é possível.

BEGIN 
IF new.cracha = old.cracha
THEN
SET old.cracha = '0';
END IF;
END

Alguma ajuda?

mysql – Error al crear dos llaves foraneas con migraciones

Tengo este problema al intentar generar esta tabla, haciendo referencia a dos llaves foraneas, primero cree las tablas que son areas y sucursal,una ves migradas y generadas en la base de datos genero la tabla empleados, pero me sale este error, tambien intente hacerlo con sintaxis de sql pero me sale el mismo error, no se que estoy haciendo mal.
añexo el codigo de la migracion y el error

este es mi error y anexo todo mi codigo de migraciones
Error de Consola

esta es la tabla que me da error al migrar

use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class Empleado extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('empleado', function (Blueprint $table){
            $table->increments('id_empleado');
            $table->String('alias');
            $table->String('carrera');
            $table->String('area');
            $table->String('clave');
            $table->String('direccion');
            $table->String('telefono');
            $table->String('conyuge');
            $table->String('hijos');
            $table->String('transporte');
            $table->String('tiempo');
            $table->String('escuela');
            $table->String('comentarios');
            $table->Integer('ida');
            $table->Integer('ids');
            $table->foreign('ida')->references('ida')->on('area');
            $table->foreign('ids')->references('idsucursal')->on('sucursal');
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }
}

las dos tablas que creo primero, areas

use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class Area extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('area', function(Blueprint $table){
            $table->increments('ida');
            $table->string('sucursal');
            $table->string('direccion');
            $table->string('importancia');
            $table->integer('cp');
            $table->string('proveedor');
            $table->timestamps();
        });
    }
}

Esta tabla es de sucursal

    use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class Sucursal extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        //
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::create('sucursal', function(Blueprint $table){
            $table->increments('ids');
            $table->string('sucursal');
            $table->string('direccion');
            $table->string('importancia');
            $table->integer('cp');
            $table->string('proveedor');
            $table->timestamps();
        });
    }
}

SSL Connection from phpmyadmin to mysql server

I am getting these errors after this config, I can’t get phpmyadmin to work with this config, need help. MySQL server is on different machine.

Thanks,

$cfg['Servers'][$i]['ssl_cert'] = '/etc/mysql/mysql.pem';
$cfg['Servers'][$i]['ssl_key'] = '/etc/mysql/mysqlkey.pem';
$cfg['Servers'][$i]['ssl_ca'] = '/usr/local/share/ca-certificates/SERVER/SERVERSSL.pem';
$cfg['Servers'][$i]['ssl_ca_path'] = '/usr/local/share/ca-certificates/SERVER';
$cfg['Servers'][$i]['ssl_verify'] = 'true';

ERRORS

Problemas con tiggers Mysql

Estoy creado un trigger que inserte una nueva "idAlumno" con el parámetro de "matrícula" del registro. Y que el parámetro de "idMatricula" se actualice con el parámetro "matrícula".

Tengo la sintaxis de un trigger que estaba elaborando pero este no funciona.

Me gustaria saber en que estoy mal y como puedo corregirlo.

Aqui esta la sintaxis.

CREATE DEFINER=root@localhost TRIGGER registrobiblioteca.registro_AFTER_INSERT AFTER INSERT ON registro FOR EACH ROW
BEGIN
declare matri int default 0;
declare lastregister int default 0;
set matri = (Select Matricula from registro getLastRecord ORDER BY idRegistro DESC LIMIT 1);
insert ignore into alumno(idAlumno) values (matri);
set lastregister = (Select idRegistro from registro getLastRecord ORDER BY idRegistro DESC LIMIT 1);
UPDATE registro SET idMatricula = matri WHERE idRegistro = lastregister;
END

La estructura de las tablas es la siguiente:

Table: alumno
Columns:
idAlumno int(11) AI PK
nombre varchar(100)
Grado int(2)
Grupo varchar(45)
idProgramaE int(11)

Table: registro
Columns:
idRegistro int(6) AI PK
entrada datetime
Matricula int(6)
idMatricula int(11)